将Elvis运算符与string.Equals结合使用

Mik*_*urg 4 .net c# c#-6.0

我想知道为什么以下代码在C#6.0中有效:(
在此示例中,数据是一个包含val作为公共字符串的随机类)

if ("x".Equals(data.val?.ToLower()) { }
Run Code Online (Sandbox Code Playgroud)

但以下行不是:

if (data.val?.ToLower().Equals("x")) { }
Run Code Online (Sandbox Code Playgroud)

Visual Studio向我显示以下错误:

无法隐式转换类型'bool?' 'bool'.存在显式转换(您是否错过了演员?)

Nas*_*ine 7

if ("x".Equals(data.val?.ToLower()) { } 
Run Code Online (Sandbox Code Playgroud)

最终会返回一个布尔值因为Equals调用但是这样:

if (data.val?.ToLower().Equals("x")) { }
Run Code Online (Sandbox Code Playgroud)

当表达式被计算时,它将返回一个System.Nullable<bool>不同于a bool(前者是可以赋值的结构,null而后者只能是true或者false)if.此外,在C#中,null值不会计算为false(根据C#规范).

  • 应该接受这个答案.简而言之,`.Equals(...)`返回一个`bool`,但`?.`可以返回null.这意味着整体上两者结合的结果是`bool`或`null`,即`bool?`(可空的bool),它不是`if`中的有效操作数. (2认同)