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

时间:2012-01-24 18:14:10

标签: c# optional-parameters

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

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

}

然而,这会产生错误:

  

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

使用此代码似乎工作正常。

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

}

我获得了使用DateTime.MinValue instead of new DateTime()的建议,因为它是自我记录的。由于new DateTime()基本上与DateTime.MinValue无法使用的基本相同?如果我将new DateTime()留下来,也会有任何潜在的问题吗?

6 个答案:

答案 0 :(得分:12)

DateTime.MinValue定义为:

public static readonly DateTime MinValue

const不同。由于readonly值不是编译时常量(即在编译时值),因此无法使用它。

使用new DateTime()的原因是因为表达式在编译时已知。这与撰写default(DateTime)相同。例如,以下表达式中的result == true

var result = new DateTime() == default(DateTime);

答案 1 :(得分:5)

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

  

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

答案 2 :(得分:4)

DateTime.MinValue(和DateTime.MaxValue)是public static readonly成员,而不是编译时常量。

为什么不使用可以为空的DateTime(DateTime.MinValue),而不是使用DateTime?作为默认值。这使得您的意图比默认为datetime的最低值更明确。

这样的事情:

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
}

或者,在方法体中设置默认值:

private void test(string something, DateTime? testVar = null )
{
  DateTime dtParameter = testVar ?? DateTime.MinValue ;

  DoSomethingUsefulWithTimestamp( something , dtParameter ) ;

}

答案 3 :(得分:3)

另一种方法是使用2个方法重载:

  • 采用DateTime参数的方法
  • 不采用DateTime参数的

这样做的好处是你不必检查参数是否为空,并且很清楚你的意图是什么。在内部,方法1可以向数据库添加null。

答案 4 :(得分:1)

基于我所知道的DateTime的默认值是DateTime.MinValue所以为什么不使用new DateTime()

答案 5 :(得分:0)

使用此声明

private void test(string something, DateTime testVar = new DateTime()) {
    if ( testVar != new DateTime() )
    {
        DoSomethingUsefulWithTimestamp( something , testVar.Value ) ;
    }
    else
    {
        DoSomethingElseWithoutTimestamp( something ) ;
    }
}

它应该工作得更好。 无效,因为它更有意义。