我在一个等待的lambda中对我的引用类型变量进行初始赋值,如下所示:
private class TestClass {
public int TestInt;
}
public async Task TestMethod() {
TestClass testVar;
await Task.Run(() => {
testVar = new();
});
var testInt = testVar.TestInt;
}
字符串
然而,最后一行给出了错误“Use of unassigned local variable 'testVar'”。C#的代码分析不能确定变量在该点被赋值是否有技术原因?在第一次使用testVar
的地方使用!
操作符有点烦人。如果我需要首先在内部分配变量,有什么方法可以解决这个问题吗?一个等待的lambda,不能方便地给予它一个默认赋值(它是一个相当复杂的类)?
2条答案
按热度按时间col17t5w1#
基本上,这是因为C#流分析无法知道传入
Task.Run
的lambda(或任何等待的接受lambda的方法)将在await
完成时被执行,所以它不会假设它会被执行。出于这个原因,我需要用TestClass testVar = null!;
初始化变量,以Assert在我访问它时它将是非空的,以消除警告/错误。mbskvtky2#
看起来这不是一个lambda/await问题,而是一个lambda表达式的一般问题。编译器似乎无法遵循lambda的路径来检测赋值。
这段代码也无法编译:
字符串
所以我首先想到编译器通常无法跟踪方法边界上的赋值,但下面的代码令人惊讶地是可以的:
型
所以这似乎是编译器对lambda函数的一些限制,但为什么-我不知道。