【发布时间】:2015-11-22 13:45:40
【问题描述】:
我一直对 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
到这里为止,一切都按预期工作。 ?. 在左侧不为空时访问成员,否则返回空。但这里的事情朝着我没有预料到的方向发展。
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null
什么?
为什么我可以从i 得到HasValue,但不能从我分配给i 的同一个表达式中得到? HasValue 怎么可能是空的?
编辑:我真正的问题是关于程序行为,而不是编译错误。我删除了关于编译的额外内容,并将这个问题更具体地集中在为什么看似相同的逻辑会返回两个不同的结果。
【问题讨论】:
标签: c# c#-6.0 null-conditional-operator