Why DateTime.MinValue can't be used as optional parameter in C#
我正在写一个方法,它将
1 2 3 | private void test(string something, DateTime testVar = DateTime.MinValue) { } |
但是,这会导致以下错误:
Default parameter value for 'testVar' must be a compile-time constant.
使用此代码似乎工作得很好。
1 2 3 |
有人建议我使用datetime.minvalue而不是新的datetime(),因为它是自记录的。既然
1 | public static readonly DateTime MinValue |
与
使用
1 |
其他答案涉及了为什么不能使用datetime.minvalue,它不是合法的编译时常量。它是一个
The expression in a default-argument must be one of the following:
· a constant-expression
· an expression of the form new S() where S is a value type
· an expression of the form default(S) where S is a value type
这会导致一个初始化为零的实例,基本上是所有零的位模式。(见:第4.1.2节)
但是,在这种情况下,我仍然建议使用
datetime.minvalue是只读的,根据msdn,只读值不是编译时常量:
The readonly keyword is different from the const keyword. A const field can only be initialized at the declaration of the field. A readonly field can be initialized either at the declaration or in a constructor. Therefore, readonly fields can have different values depending on the constructor used. Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants
与其使用
像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private void test(string something, DateTime? testVar = null ) { if ( testVar.HasValue ) { DoSomethingUsefulWithTimestamp( something , testVar.Value ) ; } else { DoSomethingElseWithoutTimestamp( something ) ; } return ; } private void DoSomethingUsefulWithTimestamp( string something , DateTime dt ) { ... // something useful } private void DoSomethingElseWithoutTimestamp( string something ) { ... // something useful } |
或者,在方法体中设置默认值:
1 2 3 4 5 6 7 | private void test(string something, DateTime? testVar = null ) { DateTime dtParameter = testVar ?? DateTime.MinValue ; DoSomethingUsefulWithTimestamp( something , dtParameter ) ; } |
另一种选择是有两个方法重载:
- 接受日期时间参数的
- 不接受datetime参数的
这样做的好处是,您不必检查参数是否为空,而且您的意图很明显。在内部,方法1可以向数据库添加空值。
基于我所知道的datetime的默认值是datetime.minvalue,所以为什么不使用new datetime()。
使用此语句
1 2 3 4 5 6 7 8 9 10 |
它应该工作得更好。空值不起作用是一个麻烦,因为它更有意义。