C#|| 运算符不使用可为空的布尔值

我的LINQ中有以下代码:

    where (tf.Shipped || tf.Ordered || tf.Processed)

请注意,“已发货”,“已订购”和“已处理”都是可空的布尔字段

我收到以下消息:

运算符|| 不能应用于类型为“布尔”的操作数? 和“布尔?”

不确定如何将其解决,因为它们需要为可为null的布尔值,而我需要使用OR(||)。

Nate Pet asked 2020-08-12T06:16:59Z
6个解决方案
103 votes

退后一步,思考问题。 您需要订购小部件,运输小部件或处理小部件的小部件集合。

对于“有序”知识,有四种可能的状态:

  • 这个小部件是有序的,我知道(是)
  • 此小部件未订购,我知道(假)
  • 此小部件已订购,但我不知道(空)
  • 此小部件未订购,但我不知道(空)

有四个状态,但只有三个值可能的值。 因此,如果“ ordered”处于空状态,则您不知道是否应将其包括在查询结果中。

编译器也不知道。

根本没有足够的信息可用于编译器来提供具有所需语义的查询。 编译器不会猜测,可能会给您带来不好的结果。 编译器将告诉您这里没有足够的信息,您需要做更多的工作才能使查询明确。

您要做的就是说在不知道答案的情况下该怎么做。 查询“所有已订购,已发货或已处理的小部件”是不可能的,因为某些小部件我们不知道是否已订购,已发货或已处理,因此我们不知道是否包含它们。 但是查询“我知道的所有小部件都已订购,或者我知道的所有小部件都已发货,或者我知道已处理”是一个编译器可以理解的查询:

where (tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false)

这意味着“如果我不知道它是否已发货,请假设不是。”

您可能需要查询“所有确实是或者可能已经发货,订购或处理过的小部件:

where (tf.Shipped ?? true) || (tf.Ordered ?? true) || (tf.Processed ?? true)

当没有足够的信息来给出准确的结果时,编译器不会猜测要在哪一侧出错。 编译器可能会猜错,我们不代表您做决定。 您将不得不做出决定。

Eric Lippert answered 2020-08-12T06:18:00Z
39 votes

尝试

 where (tf.Shipped == true || tf.Ordered  == true || tf.Processed == true )
500 - Internal Server Error answered 2020-08-12T06:18:21Z
18 votes

您需要确保表达式永远不会是null。您可以使用null-coalesce运算符??进行以下操作:

where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false))
adelphus answered 2020-08-12T06:18:44Z
5 votes
where ((tf.Shipped.HasValue && tf.Shipped.Value)
       || (tf.Ordered.HasValue && tf.Ordered.Value)
       || (tf.Processed.HasValue && tf.Processed.Value))
sll answered 2020-08-12T06:19:00Z
2 votes

您也可以在特定情况下使用GetValueOrDefault。

where (tf.Shipped.GetValueOrDefault()
    || tf.Ordered.GetValueOrDefault()
    || tf.Processed.GetValueOrDefault() )
SandRock answered 2020-08-12T06:19:20Z
1 votes
where ((tf.Shipped.HasValue && tf.Shipped.Value) 
   || (tf.Ordered.HasValue && tf.Ordered.Value) 
   || (tf.Processed.HasValue && tf.Processed.Value)) 
Nate answered 2020-08-12T06:19:38Z
translate from https://stackoverflow.com:/questions/9037171/c-sharp-operator-not-working-with-nullable-booleans