The 空传播运算符/条件访问表达式 https://roslyn.codeplex.com/discussions/540883进来c#-6.0 /questions/tagged/c%23-6.0看起来是一个非常方便的功能。但我很好奇它是否有助于解决检查子成员是否不为空,然后在 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!");
}
Will c?.Object?.Any()
编译?如果传播运算符短路(我认为这是正确的术语)为空,那么你有if (null)
,这是无效的。
C# 团队会解决这个问题吗?还是我错过了 null 传播运算符的预期用例?
这样是行不通的。您可以跳过解释并查看下面的代码:)
如你所知?.
如果子成员为 null,则运算符将返回 null。但是如果我们尝试获取一个不可为 null 的成员,例如Any()
方法,返回bool
?答案是编译器会将返回值“包装”在Nullable<>
。例如,Object?.Any()
会给我们bool?
(这是Nullable<bool>
), not bool
.
唯一不允许我们在if
声明是它不能隐式转换为bool
。但你可以明确地进行比较,我更喜欢比较true
像这样:
if (c?.Object?.Any() == true)
Console.Write("Container has items!");
感谢@DaveSexton https://stackoverflow.com/questions/25666993/c-sharp-null-propagating-operator-conditional-access-expression-if-blocks#comment40112558_25667306还有另一种方法:
if (c?.Object?.Any() ?? false)
Console.Write("Container has items!");
但对于我来说,相比之下true
看起来更自然:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)