C#||运算符不能处理可为null的布尔值

本文关键字:null 布尔值 处理 运算符 不能 | 更新日期: 2023-09-27 18:21:45

我的LINQ中有以下代码:

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

请注意,Shipped、Ordered和Processed都是可以为null的布尔字段

我收到以下消息:

运算符||不能应用于"bool?"类型的操作数和"bool?"

不知道如何将其解析为yes,它们需要是可为null的布尔值,我需要使用OR(||)。

C#||运算符不能处理可为null的布尔值

退一步思考这个问题。您想要一个小部件的集合,其中小部件是订购的,或者小部件是发货的,或者是处理的。

对于你所知道的"有序"有四种可能的状态:

  • 这个小部件是订购的,我知道(true)
  • 这个小部件没有被订购,我知道(false)
  • 这个小部件是订购的,但我不知道(null)
  • 这个小部件没有被订购,但我不知道(null)

有四种状态,但只有三个可能的值。因此,如果"ordered"处于null状态,则不知道它是否应包含在查询结果中

编译器也不知道。

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

你要做的是说在你不知道答案的情况下该做什么。查询"所有订购、发货或处理的小部件"是不可能的,因为有些小部件我们不知道它们是订购、发货还是处理的,所以我们不知道是否包括它们。但是查询"我知道的所有小部件都已订购,或者我知道已发货,或者我认为已处理"是编译器可以理解的查询:

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

这意味着"如果我不知道它是否已经发货,等等,假设它不是"。

相反,您可能希望查询"肯定是,或者可能已经发货、订购或处理的所有小部件:

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

当没有足够的信息来给出准确的结果时,编译器不会猜测你想在哪一边出错;编译器可能猜错了,我们不代表您做决定。你必须做出这个决定。

尝试

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

您需要确保表达式永远不是null。您可以使用空合并运算符??:来完成此操作

where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false))
where ((tf.Shipped.HasValue && tf.Shipped.Value)
       || (tf.Ordered.HasValue && tf.Ordered.Value)
       || (tf.Processed.HasValue && tf.Processed.Value))

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

where (tf.Shipped.GetValueOrDefault()
    || tf.Ordered.GetValueOrDefault()
    || tf.Processed.GetValueOrDefault() )
where ((tf.Shipped.HasValue && tf.Shipped.Value) 
   || (tf.Ordered.HasValue && tf.Ordered.Value) 
   || (tf.Processed.HasValue && tf.Processed.Value))