【问题标题】:Why is there no compiler error when I test for a datetime null and a compiler error when I pass a null to a method that expects a DateTime?为什么在我测试 datetime null 时没有编译器错误,而当我将 null 传递给需要 DateTime 的方法时,为什么没有编译器错误?
【发布时间】:2018-02-02 17:40:08
【问题描述】:

假设我有一个这样的构造函数:

public MyClass(DateTime dateOfBirth, decimal cost)
{
    DateOfBirth = dateOfBirth;
    Cost = cost;
}

我需要添加一些验证。我需要检查这些变量是否为空吗?

1) 如果我尝试这样做是为了成本,那么会有一个编译器警告说小数永远不会为空:

if(cost==null) { }

2) 如果我尝试为 dateOfBirth 执行此操作,则没有问题:

if(dateOfBirth==null) { }

3) 如果我尝试为 dateOfBirth 执行此操作,则会出现两个编译器错误(每个变量一个):

MyClass mc = new MyClass(null, null);

为什么在我测试 DateTime null 时没有编译器错误,而当我将 null 传递给需要 DateTime 的方法时,为什么没有编译器错误?我需要在这里对 null 做哪些验证?

【问题讨论】:

  • @Win 我认为问题更多是关于为什么 DateTime ValueType 没有像 ValueTypes 这样的 ValueTypes 在检查 null 时出现的编译器警告。
  • Comparing structs to null的可能重复
  • @Jonathon Chase,谢谢。这就是我的意思。你能回答吗?
  • @w0051977 像 ReSharper(以及扩展名为 Rider)这样的工具将根据具体情况将针对 null 的不可为空类型的检查标记为始终为真或始终为假。我不确定为什么编译器警告是针对某些结构而不是其他结构实现的。
  • @Jonathon Chase,我想在构造函数中检查 null 是没有意义的?

标签: c# .net


【解决方案1】:

decimalSystem.DateTime 都是值类型。这意味着(除非您将它们声明为可为空 - decimal?DateTime?)它们不能具有 null 值。

因此,检查它们是否为null 是没有意义的,因为它们不能具有null 值。同样,在构造函数或方法参数中为这些数据类型传递null 也是没有意义的。

至于是否使它们可以为空还是使用逻辑默认值(例如DateTime.MaxValuedecimal.MinValue)是您需要自己做出的设计选择。

至于为什么当你检查DateTimenull 时编译器没有抱怨,我真的不能肯定——这听起来像是一个编译器错误。但由于大多数开发人员没有检查 null 的值类型的习惯,因此这不是一个值得关注的主要原因。

【讨论】:

  • @NightOwl888:用null 测试值类型的相等性可能毫无意义,但它并非无效。代码将编译。
  • 我认为 OP 也想知道为什么他在将十进制与 null 进行比较时收到编译器警告,但在将 DateTime 与 null 进行比较时却没有。
  • 将 decimal 和 DateTime 都与 null 进行比较是没有意义的,因为表达式将始终为 false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多