当 text 为 null 时,text?.IndexOf(ch) != -1 为 True?
When text is null, text?.IndexOf(ch) != -1 is True?
观察:如果文本是null,这个方法returns True .我预计 False.
return text?.IndexOf('A') != -1;
当我使用 ILSpy(或检查 IL)反映以上行时,这是生成的代码:
return text == null || text.IndexOf('A') != -1;
以下是我真正需要满足的期望:
return text != null && text.IndexOf('A') != -1;
问题:有人能很好地解释空条件代码生成 OR 表达式的原因吗?
上面的行实际上涉及两个操作:空条件运算符方法调用和比较。如果将第一个运算符的结果存储为中间变量会怎样?
int? intermediate = text?.IndexOf('A');
return intermediate != -1;
显然,如果 text
为空,则 intermediate
也将为空。使用 !=
将其与 any 整数值进行比较将 return 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 条件运算符编写,只要您可以使用不同的运算符来确保与 null 的比较计算结果为 false
。在这种情况下,
return text?.IndexOf('A') > -1;
将return您期望的输出。
观察:如果文本是null,这个方法returns True .我预计 False.
return text?.IndexOf('A') != -1;
当我使用 ILSpy(或检查 IL)反映以上行时,这是生成的代码:
return text == null || text.IndexOf('A') != -1;
以下是我真正需要满足的期望:
return text != null && text.IndexOf('A') != -1;
问题:有人能很好地解释空条件代码生成 OR 表达式的原因吗?
上面的行实际上涉及两个操作:空条件运算符方法调用和比较。如果将第一个运算符的结果存储为中间变量会怎样?
int? intermediate = text?.IndexOf('A');
return intermediate != -1;
显然,如果 text
为空,则 intermediate
也将为空。使用 !=
将其与 any 整数值进行比较将 return 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 条件运算符编写,只要您可以使用不同的运算符来确保与 null 的比较计算结果为 false
。在这种情况下,
return text?.IndexOf('A') > -1;
将return您期望的输出。