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

时间:2017-07-18 10:05:34

标签: c# null-coalescing-operator

我试图安全地检查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())

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

发生了什么事?这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:8)

如果您使用bool?,则可以与==进行比较,这确实是最好/最简单的方法:

if (Foo?.Any() == true) ...

为什么if不允许==ifJon 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()返回boolFoo?.Any()将返回bool?

因为Foo?.Any().Value返回Any()没有成员bool,所以Value无法编译。

如果FoonullAny()将无法执行,因为该语句将返回null而不解释?.运算符后面的部分

但是如果您将Foo?.Any()放在paranthesis中,则可以使用bool?类型的结果并通过ValueGetValueOrDefault()进行检查:

(Foo?.Any()).GetValueOrDefault()