【发布时间】:2019-11-08 19:31:55
【问题描述】:
我把代码放在下面,也上传到了网上的c#编译器: jdoodle.com/a/1jww 该代码可以在线编译和运行,但是在我本地的Visual Studio中无法编译。
我正在使用:
Visual Studio 2017 15.9.13,
控制台应用程序,.Net Framework 4.7.2
语言版本 c# 7.3
Microsoft (R) Visual C# 编译器版本 2.10.0.0 (b9fb1610)
下面是代码:
class Program
{
static void Main()
{
Dictionary<string,int> myDict = new Dictionary<string,int>();
myDict.Add("hello", 1);
if (myDict?.TryGetValue("hello", out var value) == true)
{
Console.WriteLine("Hello" + value.ToString());
}
}
}
期待在 Console.Output 中看到 Hello1 因为如果条件为真,Null-Conditional检查肯定返回了一个非空值,并且key存在于字典中,并且从TryGetValue方法返回时必须已经赋值。
因为根据the documentation:
被调用的方法需要在方法返回之前赋值。
更新:
这是https://github.com/dotnet/roslyn/issues/32572中的一个未解决问题
如果对编译器的要求包括不发出错误警报,我认为这是一个真正的问题/错误。
我的论点:
每当 CPU 执行到 if 括号代码块内的点时,该值必须已从 TryGetValue 调用返回,并且不是“未分配的局部变量”。如果编译器在解释空条件运算符时无法期待分配状态,则更简单的解决方案是给出“无法确定分配状态”之类的警告而不是错误。
【问题讨论】:
-
FWIW:没有
?.也可以正常工作 - 即if (myDict != null && myDict.TryGetValue("hello", out var value));在一般情况下,我可以看到自定义相等运算符或真值运算符如何使这很难概括...... -
我认为您在不同的编译器中发现了一个极端情况。
-
我知道没有 ?。我目前的解决方法是在此之前进行空检查。但是我想使用 Null-Conditional 来演示这个问题,因为编译器推断错误。
标签: c# compiler-errors