是否存在技术原因导致代码分析无法确定该变量已被设置?

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 中分配变量,并且不能方便地给它默认分配(这是一个相当复杂的类),有什么方法可以解决这个问题?

PMF*_*PMF 1

看起来这不是 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 函数的一些限制,但为什么 - 我不知道。