编译器错误地指示使用未赋值的局部变量错误



给定此代码:

private void TryIt(Dictionary<int, int> myDict)
{
    if (myDict?.TryGetValue(1, out int myValue) ?? false)
    {
        Console.Out.WriteLine(myValue); // <-- Error CS0165
    }
}

c# 编译器发出:

error CS0165: Use of unassigned local variable 'myValue'
但是,当

?.操作员跳过对TryGetValue()的调用时,显然不可能引用myValue。这是因为生成的null通过 ?? false 转换为false

换句话说,如果myDict null?.算子将跳过对TryGetValue()的调用,myValue未分配。我明白了。

但是??运算符将始终计算该空传播到false,在这种情况下防止进入if块。

这在编译时很明显,那么为什么会出现错误呢?

我怀疑这可能与所有这些语法糖最终如何解开成实际的 .NET p 代码有关,但错误似乎仍然是错误的......

不使用 .? 运算符时,我没有收到任何错误,这是预期的:

    if (myDict.TryGetValue(1, out int myValue))
    {
        Console.Out.WriteLine(myValue); // <-- NO ERROR
    }

只是当我将.??? false一起使用时.

"但显然不可能...">

这是正确的,但编译器不会深入跟踪逻辑。

编译器本可以推导出这一点,但请注意,myValue 的范围超出了 if 语句:

if (myDict?.TryGetValue(1, out int myValue) ?? false)
{
    Console.Out.WriteLine(myValue); // <-- Error CS0165
}
Console.Out.WriteLine(myValue); // myValue is in scope here

因此,虽然您可能希望编译器找出所有?.??逻辑,并且if () { ... }中的代码是一个特例,但这显然是一个被认为不够重要的功能。

myDict?.TryGetValue(1, out int myValue)并不总是分配给myValue

相关内容

  • 没有找到相关文章

最新更新