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

前端之家收集整理的这篇文章主要介绍了C#空传播运算符/条件访问表达式&if blocks前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
c#-6.0c#-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()编译?如果传播操作符短路(我认为这是正确的术语)为null,那么你有if(null),这是无效的.

C#团队会解决这个问题吗,或者我缺少null传播运算符的预期用例?

解决方法

它不会这样工作.你可以跳过说明,看下面的代码:)

如你所知 ?.如果子成员为空,操作符将返回null.但是,如果我们尝试获取一个不可空的成员,就像返回bool的Any()方法会发生什么?答案是编译器将“Nullable”中的“返回”值返回.例如,Object?.Any()会给我们bool? (这是Nullable< bool>),而不是bool.

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

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

Thanks to @DaveSexton还有另一种方法

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

但对于我来说,与真实的比较似乎更加自然:)

原文链接:https://www.f2er.com/csharp/94074.html

猜你在找的C#相关文章