我一直感兴趣地关注 C#6 中添加的安全导航运算符功能。我已经期待了一段时间了。但我发现一些与我预期不同的行为。我意识到我真的不明白它是如何工作的。
鉴于这个类
class Foo {
public int? Measure;
}
这是一些使用 new 运算符的代码。
Foo f = new Foo { Measure = 3 };
Console.WriteLine(f?.Measure); // 3
f = new Foo { Measure = null };
Console.WriteLine(f?.Measure); // null
f = null;
Console.WriteLine(f?.Measure); // null
到这里为止,一切都按预期工作。 ?.
当左侧不为 null 时正在访问成员,否则返回 null。但这里的事情朝着我没想到的方向发展。
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null
什么?
为什么我可以从我分配给的同一个表达式中得到HasValue
,i
但不能得到i
?怎么可能HasValue
是空的?
编辑:我真正的问题是关于程序行为,而不是编译错误。我删除了关于编译的额外内容,并将这个问题更狭隘地集中在为什么看似相同的逻辑会返回两个不同的结果。