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?.
| 归档时间: |
|
| 查看次数: |
2794 次 |
| 最近记录: |