它是 空条件 运算符。它基本上意味着:
“评估第一个操作数;如果为空,则停止,结果为空。否则,评估第二个操作数(作为第一个操作数的成员访问)。”
在您的示例中,关键是如果
ais
null,
a?.PropertyOfA则将求值
null而不是抛出异常-
然后它将与该
null引用进行比较
foo(使用字符串的
==重载),发现它们不相等,执行将进入
if语句主体。
换句话说,它是这样的:
string bar = (a == null ? null : a.PropertyOfA);if (bar != foo){ ...}…除了
a只评估一次。
请注意,这也可以更改表达式的类型。例如,考虑
FileInfo.Length。这是type的属性
long,但是如果将其与null条件运算符一起使用,则最终会得到type的表达式
long?:
FileInfo fi = ...; // fi could be nulllong? length = fi?.Length; // If fi is null, length will be null



