6

观察:如果 text 为null,则此方法返回True。我期待False

return text?.IndexOf('A') != -1;

当我使用 ILSpy(或检查 IL)反映上述行时,这是生成的代码:

return text == null || text.IndexOf('A') != -1;

这是我真正需要满足我的期望:

return text != null && text.IndexOf('A') != -1;

问题:有人对为什么 Null 条件代码生成OR表达式有很好的解释吗?

完整示例:https ://dotnetfiddle.net/T1iI1c

4

1 回答 1

7

上面这行实际上涉及两个操作:一个空条件运算符方法调用和一个比较。如果将第一个运算符的结果存储为中间变量会发生什么?

int? intermediate = text?.IndexOf('A');
return intermediate != -1;

显然,如果text为空,那么intermediate也将为空。将此与任何整数值使用!=将返回true

来自 MSDN(重点是我的):

当您对可空类型执行比较时,如果一个可空类型的值为 null 而另一个不是,则所有比较的结果都为 false ,但 != (not equal) 除外

只要您可以使用不同的运算符来确保与 null 的比较计算结果为 ,就可以使用 null 条件运算符编写代码false。在这种情况下,

return text?.IndexOf('A') > -1;

将返回您期望的输出。

于 2016-06-07T01:29:15.473 回答