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