当前位置: 首页 > 编程语言 > C#

C#空传播运算符-条件访问表达式&if块共享

时间:2023-04-10 16:07:47 C#

C#空传播运算符/条件访问表达式&if块空传播运算符/条件访问表达式在c#-6.0中看到很方便。但我很好奇它是否有助于解决检查子成员是否为null然后在if块内对所述子成员调用布尔方法的问题:publicclassContainer{IEnumerableObjects{get;set;}}publicContainerBuildContainer(){varc=新容器();if(/*一些随机条件*/)c.对象=新列表{1,2,4};}publicvoidTest(){varc=BuildContainer();//旧方法if(null!=c&&null!=c.Objects&&c.Objects.Any())Console.Write("Containerhasitems!");//C#6方式?if(c?.Object?.Any())Console.Write("Containerhasitems!");c?.Object?.Any()编译吗?如果扩展运算符将(我认为这是正确的术语)短路为null,则您有if(null),它是无效的。C#团队会解决这个问题,还是我错过了null传播运算符的预期用例?它不是那样工作的。您可以跳过说明并查看下面的代码:)如您所知?。如果子成员为null,运算符将返回null。但是如果我们尝试获取一个不可为null的成员,比如返回bool的Any()方法,会发生什么?答案是编译器会对Nullable的返回值进行“包装”。例如,Object?.Any()会给我们bool?(可空),而不是布尔值。唯一不允许我们在if语句中使用此表达式的是它不能隐式转换为bool。但是你可以明确地比较,我更喜欢这样比较真:if(c?.Object?.Any()==true)Console.Write("Containerhasitems!");谢谢@DaveSexton还有另一种方法:if(c?.Object?.Any()??false)Console.Write("Containerhasitems!");但在我的例子中与true比较似乎更自然:)Null条件运算符将返回null或表达式末尾的值。对于值类型,它将返回Nullable,因此在您的情况下它将是Nullable。如果我们查看文档中即将推出的C#函数(此处指定)的示例,它有一个示例:int?first=customers?[0].Orders.Count();在上面的示例中,将返回Nullable而不是int。对于bool,它将返回Nullable。如果您在VisualStudio“14”CTP中尝试以下代码:NullableifExist=c?.Objects?.Any();上面一行的结果是Nullable/bool?。之后您可以进行如下比较:使用null合并运算符??if(c?.Object?.Any()??false)使用Nullable.GetValueOrDefault方法if((c?.Objects?.Any()).GetValueOrDefault())使用并与true比较以上是C#学习教程:C#空传播运算符/条件访问表达式&if块。如果对你有用,需要进一步了解C#学习教程,希望大家多多分享关注—if(c?.Objects?.Any()==true)本文收集自网络,确实不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: