【问题标题】:Using Elvis operator in combination with string.Equals将 Elvis 运算符与 string.Equals 结合使用
【发布时间】:2015-10-22 13:49:16
【问题描述】:

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

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

但以下行不是:

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

Visual Studio 显示以下错误:

不能隐式转换类型'bool?' '布尔'。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 如果 (null) ,你会如何处理?这可以用 data.val 返回什么?
  • 我认为因为 "x".Equals 返回 bool,而 data.val?..... 可以返回 null。而且null不能转成bool。
  • 我们团队中有一个人几个月来一直称它为Evlis operator。以为只有他一个。
  • 我猜是因为data.val?bool?,换句话说,它可以为空。所以你可以做"x".Equals(null),但如果val 为空,整个事情将评估为null。所以你需要类似if(data.val?.ToLower().Equals("x") == true) {}
  • 我建议你使用object.Equals(data.val?.ToLower(),"x"),而不用担心评估结果。

标签: c# .net c#-6.0


【解决方案1】:
if ("x".Equals(data.val?.ToLower()) { } 

由于Equals 的调用最终会返回一个布尔值,但是这个:

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

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

【讨论】:

  • 这应该被接受为答案。简而言之,.Equals(...) 返回 bool,但 ?. 可能返回 null。这意味着两者结合的总体结果是boolnull,即bool? (nullable bool),它不是if 中的有效操作数
  • Nullable<bool> 不是引用类型,Nullable<T> 是一个结构,尽管它具有一些不寻常的属性。
  • @svick 感谢您的更正。我从来没有意识到它是一个结构,因为我可以给它一个空值。我相应地编辑了我的答案。
【解决方案2】:

我没有要测试的 c# 6.0,但这应该可以工作

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

【讨论】:

  • 我同意,?。会说不要运行其余的。所以当 data.val 为 null 时返回 null 而不是 bool。这 ??将使用 false 而不是 null。
  • (data.val?.ToLower().Equals("x")).GetValueOrDefault()
  • 甚至(data.val?.ToLower()).Equals("x")
【解决方案3】:

第一条语句计算Equals 的返回值,而第二条语句计算为bool?,它可能为空。

【讨论】:

    【解决方案4】:

    除了其他答案之外,我认为如果您将等效代码直接编写出来,这样您就可以看到发生了什么,这很有用。

    第一行相当于:

    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.valnull,则语句data.val?.ToLower().Equals("x") 将返回null,否则它将返回data.val.ToLower().Equals("x") 的结果。因为该语句可以返回nullbool,所以整个语句的类型是bool?,但您不能直接在if 中使用bool?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2019-11-12
      相关资源
      最近更新 更多