Jez*_*Jez 5 .net c# roslyn roslyn-code-analysis microsoft.codeanalysis
我正在等待的 lambda 中对引用类型变量进行初始赋值,如下所示:
private class TestClass {
public int TestInt;
}
public async Task TestMethod() {
TestClass testVar;
await Task.Run(() => {
testVar = new();
});
var testInt = testVar.TestInt;
}
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出错误“使用未分配的局部变量'testVar'”。是否存在技术原因导致 C# 的代码分析无法确定该变量已保证在该点被赋值?!在我第一次使用的地方使用操作符有点烦人testVar。如果我需要首先在等待的 lambda 中分配变量,并且不能方便地给它默认分配(这是一个相当复杂的类),有什么方法可以解决这个问题?
看起来这不是 async/await 问题,而是 lambda 表达式的一般问题。编译器似乎无法遵循 lambda 的路径来检测赋值。
此代码也无法编译:
private class TestClass
{
public int TestInt;
}
public void TestMethod()
{
TestClass testVar;
Action a = new Action(() =>
{
testVar = new();
});
a.Invoke();
var testInt = testVar.TestInt; // Same here: "testVar" is not initialized
}
Run Code Online (Sandbox Code Playgroud)
所以我首先认为编译器通常无法跟踪方法边界上的赋值,但以下代码令人惊讶的是没问题:
public void TestMethod()
{
TestClass testVar;
void Foo()
{
testVar = new();
}
Foo();
var testInt = testVar.TestInt; // No more complaints!
}
Run Code Online (Sandbox Code Playgroud)
所以这似乎是编译器关于 lambda 函数的一些限制,但为什么 - 我不知道。