观察:如果文字 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 表达式的原因有很好的解释吗?
答案 0 :(得分:7)
上面的行实际上涉及两个操作:空条件运算符方法调用和比较。如果将第一个运算符的结果存储为中间变量会发生什么?
int? intermediate = text?.IndexOf('A');
return intermediate != -1;
显然,如果text
为空,则intermediate
也将为空。使用!=
将此与任何整数值进行比较将返回true
。
From MSDN(强调我的):
当您对可空类型进行比较时,如果其中一个可空类型的值为null而另一个不为null,则所有比较都会计算为false ,除了!=(不等于)。< / p>
此代码可以使用空条件运算符编写,只要您可以使用不同的运算符来确保与null的比较计算为false
。在这种情况下,
return text?.IndexOf('A') > -1;
将返回您期望的输出。