【问题标题】:Linq DateTime expressions wont compare if only one is nullable如果只有一个可以为空,Linq DateTime 表达式将不会比较
【发布时间】:2010-06-16 05:27:38
【问题描述】:

我遇到了以下异常:

二元运算符 GreaterThanOrEqual 没有为类型定义 'System.Nullable`1[System.DateTime]' 和“System.DateTime”。

我从一个可以为空的日期时间变量的类属性中获取左侧表达式,而我的右侧正在使用

Expression.Constant(new Nullable<DateTime>(DateTime.Now))

但是,尽管将右手表达式显式设置为可为空的类型,我仍然得到上述异常

【问题讨论】:

  • 你能发布更多你的代码吗?

标签: c# linq


【解决方案1】:

Expression.Constant 接受一个对象,因此在您的代码中,参数被装箱。装箱一个可为空的值实际上是装箱底层值(见Boxing Nullable Types),所以Expression.Constant 认为参数是DateTime 而不是DateTime?。

您可以强制将 ConstantExpression 设为 DateTime?通过使用接受类型的 Expression.Constant 的重载:

Expression.Constant(DateTime.Now, typeof(DateTime?))

【讨论】:

    【解决方案2】:

    归结为可空类型是一个相当容易泄漏的抽象。在将 DateTime 分配给 DateTime? 时它们工作正常?但是通过比较,事情变得棘手,因为 System.Nullable 并不真正知道如何处理它们。

    DateTime 之间有没有隐式转换?和 DateTime,所以你需要做的实际上是从 nullable 中获取一个真正的 DateTime 值来进行比较。最简单的方法是使用可空日期时间中的GetValueOrDefault() 方法。如果它不为 null,这将为您提供值,如果为 null,则为默认 DateTime(我相信是 DateTime.MinValue)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多