如何为布尔条件取消合并?

Tob*_*oby 8 c# null-coalescing-operator

我正试着安全地检查一下IList<>是不是空的.

var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject>
if (Foo?.Any())
    // Do cool stuff with items in Foo
Run Code Online (Sandbox Code Playgroud)

但是条件有错误:

不能隐含地转换'bool?' 'bool'.存在显式转换(您是否错过了演员?)

因此,似乎条件评估为可空的布尔,所以我尝试

if (Foo?.Any().Value())
Run Code Online (Sandbox Code Playgroud)

但这也不好:

'bool'不包含'Value'的定义,也没有扩展.... blah blah blah

因此,在第一种情况下,它抱怨它是一个可以为空的布尔,但在第二种情况下,它抱怨它不是.

作为另一种途径,我尝试:

if (Foo?.Any() == true)
Run Code Online (Sandbox Code Playgroud)

这有效 - 但它不应该因为这使用了第一条消息说它不想要的隐式转换!

到底是怎么回事?这样做的正确方法是什么?

Tim*_*ter 10

你可以比较bool?你使用的==,这确实是最好/最简单的方法:

if (Foo?.Any() == true) ...
Run Code Online (Sandbox Code Playgroud)

至于为什么它不允许,if但是==,Jon Skeet可以更好地解释它:

没有从Nullable到bool的隐式转换.有一个从bool到Nullable的隐式转换,这就是第一个版本中每个bool常量发生的事情(用语言术语).bool运算符==(然后应用Nullable,Nullable运算符.(这与其他提升的运算符不完全相同 - 结果只是bool,而不是Nullable.)

换句话说,表达式'fred == false'的类型为bool,而表达式'fred'的类型为Nullable,因此您不能将其用作"if"表达式.

所以if只允许,bool但你有一个,bool?==操作员转换bool为a bool?,你可以比较两个bool?.

  • OP已经尝试了这个_这是有效的 - 但它不应该因为这使用了第一条消息说它不想要的隐式转换!_ (2认同)