我试图安全地检查Horizontal spacing constraint
是否为空。
IList<>
但是条件有错误:
无法隐式转换“bool”&#39;到了布尔&#39;。存在显式转换(您是否错过了演员?)
所以似乎条件评估为可空的bool,所以我尝试
var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject>
if (Foo?.Any())
// Do cool stuff with items in Foo
但这也不好:
&#39;布尔&#39;不包含&#39;价值&#39;的定义没有延期....等等等等等等
所以在第一个例子中,它抱怨它是一个可以自欺欺人的布尔,但在第二个例子中它抱怨它不是。
作为另一种途径,我尝试:
if (Foo?.Any().Value())
这有效 - 但它不应该是因为它使用了第一条消息说它不想要的隐式转换!
发生了什么事?这样做的正确方法是什么?
答案 0 :(得分:8)
如果您使用bool?
,则可以与==
进行比较,这确实是最好/最简单的方法:
if (Foo?.Any() == true) ...
为什么if
不允许==
,if
,Jon Skeet can explain更好:
没有从Nullable到bool的隐式转换。有 从bool到Nullable的隐式转换,就是这样 发生(用语言术语)第一个中的每个bool常量 版。 bool运算符==(Nullable,Nullable运算符 然后应用。 (这与其他提升的运营商并不完全相同 - 结果只是bool,而不是Nullable。)
换句话说,表达式'fred == false'的类型为bool, 而表达'fred'的类型为Nullable,因此你 不能将它用作“if”表达式。
因此bool
仅允许bool?
,但您有==
但bool
运算符会将bool?
转换为bool?
而您可以比较两个Select top (1) with ties item_id, lat, lng, latest
from yourtable
Order by Row_Number() over(partition by item_id order by latest desc)
。
答案 1 :(得分:3)
修改强>:
似乎bool?
的原因是Foo?.Any()
本身。如果您不想将其与true
进行比较,我建议您使用临时变量:
bool? any = Foo?.Any();
if (any.Value) ...
或者,如果对象是类,则可以使用FirstOrDefault() != null
作为检查条件。它不会花费时间,因为它只会获得第一个对象:
if (Foot?.FirstOrDefault() != null)...
我会使用临时变量或Foo?.Any() == true
选项。
<强>原始强>:
注意:令我惊讶的是if (a?.Any())
或.Value()
(!)无法跟随.Value
。
我认为您需要的是Value
(属性),而不是()
(方法):
if (Foo?.Any()?.Value) ...
bool?
有.Value
(属性),bool
。
答案 2 :(得分:2)
Any()
返回bool
但Foo?.Any()
将返回bool?
因为Foo?.Any().Value
返回Any()
没有成员bool
,所以Value
无法编译。
如果Foo
为null
,Any()
将无法执行,因为该语句将返回null
而不解释?.
运算符后面的部分
但是如果您将Foo?.Any()
放在paranthesis中,则可以使用bool?
类型的结果并通过Value
或GetValueOrDefault()
进行检查:
(Foo?.Any()).GetValueOrDefault()