c# - 编译器错误地指示使用未分配的局部变量错误

标签 c# compiler-errors nullable out null-propagation-operator

<分区>

给定这段代码:

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'

但显然不能引用myValue当调用 TryGetValue()?. 跳过运算符(operator)。这是因为生成的 null转换为 false通过 ?? false .

换句话说,如果 myDictnull , ?.接线员将跳过对 TryGetValue() 的调用, 离开 myValue未分配。我明白了。

但是 ??然后,运算符将始终评估该空传播到 false ,在这种情况下阻止进入 if block 。

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

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

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

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

就在我用.?的时候与 ?? false .

最佳答案

"But it is clearly not possible ..."

这是正确的,但编译器并没有深入跟踪逻辑。

编译器可以推断出这一点,但请注意 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

关于c# - 编译器错误地指示使用未分配的局部变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622139/

相关文章:

c# - 委托(delegate)创建者为可空类型创建比较器

mongodb - Doctrine MongoDB ODM nullable=false 不工作

c# - 程序集访问

c# - WPF 自定义 TextTrimming

c++ - 编译一个简单的C++程序时的一个问题

ruby-on-rails - SCSS编译错误

编译器在 C 程序中抛出错误 "undefined symbol"

.net - 可空枚举类型的奇怪行为

c# - 订阅 ObservableCollection 项目属性已更改 - WPF

c# - 在 C#/WPF 中获取 PathGeometry(线)的长度