【发布时间】: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。
换句话说,如果myDict 是null,?. 运算符将跳过对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