为什么DateTime.MinValue不能在C#中用作可选参数

Mad*_*Boy 18 c# optional-parameters

我正在编写一种方法,它将DateTime值作为其中一个参数.我决定它是可选参数,所以我继续尝试DateTime.MinValue默认.

private void test(string something, DateTime testVar = DateTime.MinValue) {

}
Run Code Online (Sandbox Code Playgroud)

但是这会产生一个错误:

'testVar'的默认参数值必须是编译时常量.

使用此代码似乎工作得很好.

private void test(string something, DateTime testVar = new DateTime()) {

}
Run Code Online (Sandbox Code Playgroud)

我得到了建议,使用DateTime.MinValue而不是新的DateTime(),因为它是自我记录的.既然new DateTime()是基本相同的东西为什么DateTime.MinValue不能用?如果我把它留下来也会有任何潜在的问题new DateTime()吗?

Yuc*_*uck 12

DateTime.MinValue 定义为:

public static readonly DateTime MinValue
Run Code Online (Sandbox Code Playgroud)

哪个不一样const.由于readonly值不是编译时常量(即在编译时评估该值),因此无法使用它.

使用new DateTime()作品的原因是因为该表达式在编译时已知的.这和写作一样default(DateTime).例如,result == true在以下表达式中:

var result = new DateTime() == default(DateTime);
Run Code Online (Sandbox Code Playgroud)


Ant*_*ram 9

其他答案触及了为什么不能使用DateTime.MinValue,它不是合法的编译时常量.它是一个static readonly字段,就使用情况而言可能很好,但不是合法的,也不符合可用作默认参数的规则.至于new DateTime() 可以使用的原因,请参阅C#4.0语言规范的第10.6.1节.相关位:

default-argument中的表达式必须是以下之一:

·一个常量表达式

· new S()形式的表达式,其中S是值类型

· 形式为default(S)的表达式,其中S是值类型

这导致零初始化实例,基本上是全零的位模式.(见:第4.1.2节)

但是,在这种情况下,我仍然建议使用a DateTime? value = null作为参数和默认参数,特别是当它表示数据库中可以为空的日期时.MinValue不是没有价值.null是.


Mar*_*ill 5

DateTime.MinValue是只读的,根据MSDN,readonly值不是编译时常量:

readonly关键字与const关键字不同.const字段只能在字段声明时初始化.可以在声明或构造函数中初始化只读字段.因此,readonly字段可以具有不同的值,具体取决于所使用的构造函数.此外,虽然const字段是编译时常量,但readonly字段可用于运行时常量