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

时间:2015-10-22 13:49:16

标签: c# .net c#-6.0

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

if ("x".Equals(data.val?.ToLower()) { }

但以下行不是:

if (data.val?.ToLower().Equals("x")) { }

Visual Studio向我显示以下错误:

  

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

4 个答案:

答案 0 :(得分:7)

profileId

最终将返回一个布尔值,因为Equals调用但是:

if ("x".Equals(data.val?.ToLower()) { } 

当表达式被计算时,它将返回System.Nullable<bool>,它不同于if (data.val?.ToLower().Equals("x")) { } (前者是可以赋值bool的结构,而后者只能是null {1}}或truefalse期望。此外,在C#中,if值不会被评估为false(根据C#规范)。

答案 1 :(得分:3)

我没有c#6.0来测试,但这应该可行

if (data.val?.ToLower().Equals("x") ?? false) { }

答案 2 :(得分:2)

第一个语句是评估Equals的返回值,而第二个语句评估为bool?,可能为null。

答案 3 :(得分:1)

除了其他答案之外,我认为如果您长时间编写相同的代码,那么它很有用,这样您就可以看到正在发生的事情。

第一行相当于:

string temp = data.val != null ? data.val.ToLower() : null;
if ("x".Equals(temp)) { }

这是非常有效和明显的。

第二个陈述相当于:

bool? temp = data.val != null ? data.val.ToLower().Equals("x") : null;
if (temp) { } //error

这可能不太明显,但如果data.val?.ToLower().Equals("x")null,则data.val语句将返回null,否则会返回data.val.ToLower().Equals("x")的结果。由于该语句可以返回nullbool,因此整个语句的类型为bool?,但您无法直接在bool?中使用if

正如其他人所指出的那样,将bool?转换为bool会解决您的问题。一种方法是使用GetValueOrDefault()

if (data.val?.ToLower().Equals("x").GetValueOrDefault()) { }