加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:57:24 所属栏目:百科 来源:网络整理
导读:c#-6.0在 c#-6.0出现看起来是一个很方便的功能.但是我很好奇,如果它有助于解决检查子成员是否不为null的问题,然后在if块中的所有子成员上调用布尔方法: public class Containerint{ IEnumerableint Objects {get;set;} } public Container BuildContainer()
c#-6.0在 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()编译?如果传播操作符短路(我认为这是正确的术语)为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!");

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读