观察:如果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;
解决方法
上面的行实际上涉及两个操作:空条件运算符方法调用和比较.如果将第一个运算符的结果存储为中间变量会发生什么?
int? intermediate = text?.IndexOf('A'); return intermediate != -1;
显然,如果text为null,则intermediate也将为null.使用!=将其与任何整数值进行比较将返回true.
From MSDN(强调我的):
When you perform comparisons with nullable types,if the value of one of the nullable types is null and the other is not,all comparisons evaluate to false except for != (not equal).
只要您可以使用不同的运算符来确保与null的比较计算结果为false,就可以使用空条件运算符编写此代码.在这种情况下,
return text?.IndexOf('A') > -1;
将返回您预期的输出.