当我将null传递给期望DateTime的方法时,为什么在测试datetime null和编译器错误时没有编译器错误?

时间:2018-02-02 17:40:08

标签: c# .net

说我有这样的构造函数:

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做什么验证?

1 个答案:

答案 0 :(得分:1)

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

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

  

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

至于为什么编译器在DateTime检查null时没有抱怨,我无法确切地说 - 这听起来像编译器错误。但由于大多数开发人员不习惯检查null的值类型,因此不是主要原因。