C#空传播运算符/条件访问表达式和if块

C#-6.0中的Null传播运算符/有条件访问表达式看起来非常方便。 但是我很好奇它是否有助于解决检查子成员是否为空,然后在if块内的子成员上调用布尔方法的问题:

  public class Container<int>{
       IEnumerable<int> Objects {get;set;}
  }

  public Container BuildContainer()
  { 
      var c = new Container();

      if (/* Some Random Condition */)
         c.Objects = new List<int>{1,2,4};
  }

  public void Test()
  {
      var c = BuildContainer();

      //Old way
      if ( null != c && null != c.Objects && c.Objects.Any())
         Console.Write("Container has items!");


      //C# 6 way?
      if (c?.Object?.Any())
          Console.Write("Container has items!");
  }

c?.Object?.Any()编译? 如果传播运算符短路(我认为这是正确的术语)为空,那么你有if (null) ,这是无效的。

C#团队是否会解决这个问题,或者我是否遗漏了空传播运算符的预期用例?


它不会以这种方式工作。 你可以跳过解释并查看下面的代码:)

你知道?. 如果子成员为空,则运算符将返回null。 但是如果我们试图获得返回bool的非空成员,比如Any()方法,会发生什么? 答案是,编译器将“包装” Nullable<>的返回值。 例如, Object?.Any()会给我们bool? (这是Nullable<bool> ),而不是bool

唯一不让我们在if语句中使用这个表达式的是,它不能隐式地转换为bool 。 但是你可以明确地做比较,我喜欢比较true像这样:

if (c?.Object?.Any() == true)
    Console.Write("Container has items!");

感谢@DaveSexton还有另一种方式:

if (c?.Object?.Any() ?? false)
    Console.Write("Container has items!");

但对我而言,与true比较似乎更自然:)


空条件运算符将返回null或表达式末尾的值。 对于值类型它会返回Nullable<T> ,所以在你的情况下它会是Nullabe<bool> 。 如果我们看一下C#中即将发布的特性文档中的例子(这里指定),它有一个例子:

int? first = customers?[0].Orders.Count();

在上面的例子中,将返回Nullable<int>而不是int 。 对于bool ,它将返回Nullable<bool>

如果您在Visual Studio“14”CTP中尝试以下代码:

Nullable<bool> ifExist = c?.Objects?.Any();

上述行的结果将是一个Nullable<bool> / bool? 。 稍后,您可以进行如下比较:

使用空合并运算符?

 if (c?.Object?.Any() ?? false)

使用Nullable<T>.GetValueOrDefault方法

if ((c?.Objects?.Any()).GetValueOrDefault())

使用与true比较

if (c?.Objects?.Any() == true)
链接地址: http://www.djcxy.com/p/2101.html

上一篇: C# Null propagating operator / Conditional access expression & if blocks

下一篇: What does CultureInfo.InvariantCulture mean?