【发布时间】:2017-12-23 03:12:02
【问题描述】:
我正在尝试安全地检查 IList<> 是否不为空。
var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject>
if (Foo?.Any())
// Do cool stuff with items in Foo
但是条件有错误:
不能隐式转换 'bool?' '布尔'。存在显式转换(您是否缺少演员表?)
所以看起来条件评估为可以为空的布尔值,所以我尝试
if (Foo?.Any().Value())
但这也不好:
'bool' 不包含 'Value' 的定义,也没有扩展名...... blah blah blah
所以在第一种情况下它抱怨它是一个可为空的布尔值,但在第二种情况下它抱怨它不是。
作为我尝试的另一种途径:
if (Foo?.Any() == true)
这行得通 - 但它不应该因为这使用了第一条消息说它不想要的隐式转换!
发生了什么事?这样做的正确方法是什么?
【问题讨论】:
-
if (Foo?.Count > 0) { }
-
@AndzejMaciusovic:这是个坏方法。如果
Foo实际上是一个需要数小时才能完全执行的查询,您将严重错过Any。如果您想知道是否至少有一个,请不要全部计算。 -
@TimSchmelter 在我的示例中,我使用的是 .Count 而不是 Count()。Count 已经是 IList 上的计算字段,实际上使用 .Count 而不是 .Any() 会更快一些。在名单上。
-
@AndzejMaciusovic:是的,但是人们通常会理解这是一种好方法,而忽略了缺少的括号(在 VB.NET 中它们是可选的)。
标签: c# null-coalescing-operator