gpt4 book ai didi

c# - 如果 "Error CS1628: Cannot use in ref or out parameter inside an anonymous method, lambda or query expression",如何在线程中使用 ref 参数?

转载 作者:行者123 更新时间:2023-12-04 07:12:48 34 4
gpt4 key购买 nike

我正在尝试编写一个补间类(class),为此我有一个静态 Tweener.TweenTo方法。在其中,我们启动了一个线程,以便不阻止外部操作。该方法如下所示:

public static void TweenTo<T>(ref ITweenable<T> obj, T target, double ms)
{
new System.Threading.Thread(() => {
System.Threading.Thread.Sleep(5000)
obj.DoStuff(5,5) //throws exception because obj is a ref parameter
}).Start()
}
我知道在 lambda 中使用 ref 参数意味着它可能是一个悬空引用,但我需要能够使用它,以防用户尝试将值类型或结构传递给方法。我曾尝试使用参数化线程启动,但这会将事物强制转换为我无法使用的对象(拆箱等)。我也尝试过使用一个包含指向它的指针的包装类,但这会在以后遇到并发症。
我想要一种在线程中使用此 ref 参数的方法,并且最好在其中保留其生命周期。
任何帮助表示赞赏:D
编辑:Olivier 的答案接近我需要的答案,但 MyClass 在某些情况下将是一个结构,并且它会尽可能复制。这意味着它将丢失引用并从错误的实例中给出值。
编辑 2:示例结构
public struct MyStruct : ITweenable<T> {
int x;
int y;
public MyStruct(int X) {
this.x=X;
}
public void DoStuff(int newX, int newY) {
this.x=newX;
this.y=newY;
}
}

public interface ITweenable<T> {
void DoStuff(int newX, int newY);
}
编辑 3:我还没有测试过这个,所以当我有的时候我会把它作为答案:
public static void TweenTo<T>(ITweenable<T> obj, T target, double ms)
{
Func<ITweenable<T>> getTween = ()=>{return obj;}
new System.Threading.Thread(() => {
System.Tgreading.Thread.Sleep(5000)
getTween().DoStuff(5,5);
}).Start()
}

最佳答案

我建议通过 Action<ITweenable<T>>以启用分配。像这样:

public static void TweenTo<T>(ITweenable<T> obj, Action<ITweenable<T>> update, T target, double ms)
{
new System.Threading.Thread(() =>
{
obj.DoStuff();
update(new Tweenable<T>());
}).Start()
}

关于c# - 如果 "Error CS1628: Cannot use in ref or out parameter inside an anonymous method, lambda or query expression",如何在线程中使用 ref 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68971071/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com