【问题标题】:Use of unassigned local variable error is incorrectly indicated by compiler [duplicate]编译器错误地指示使用未分配的局部变量错误[重复]
【发布时间】:2019-09-01 11:28:37
【问题描述】:

鉴于此代码:

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

换句话说,如果myDictnull?. 运算符将跳过对TryGetValue() 的调用,而使myValue 未分配。我明白了。

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

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

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

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

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

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

【问题讨论】:

  • 根据 C# 语言规范,错误信息并非不正确。编译器实际上不可能 100% 正确地评估执行流程,因此必然存在限制。出于实际原因,这些限制相当狭窄,并且不包括您想要工作的场景。请参阅标记的重复项。第一个是正是您要询问的场景,您应该自己找到它,而不是问一个新问题。第二个更普遍地解决了相同的基本问题(即非常量的if 表达式使if 正文可达)

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


【解决方案1】:

“但显然不可能……”

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

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

【讨论】:

  • 我试图弄清楚 ` 的意图是什么? false ` 将是,因为 TryGetValue 返回 bool。我怀疑意图更接近` if (myDict?.TryGetValue(1, out int myValue) ? true : false )` 但是......也许我错过了一些东西
  • "as .TryGetValue() 返回 bool" - 是的,但 ?.TryGetValue() 可能返回 bool 或 null 所以它变成 bool?
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多