值的默认参数必须是编译时常量?

时间:2013-09-11 11:52:11

标签: c# .net parameters

这是我的方法签名。在尝试将end作为可选参数传递时,它会给我这个错误。我该怎么做才能解决这个问题?为什么DateTime.MinValue不是常数?

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue,
                                          out string date, out string time)

7 个答案:

答案 0 :(得分:69)

DateTime.MinValue不是const,因为该语言不喜欢const上的DateTime。一种选择是使用DateTime?代替,即

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null,
     out string date, out string time)
{
    var effectiveEnd = end ?? DateTime.MinValue;
    // ...
}

但是,在默认参数之后,您仍然会遇到非默认参数的问题 - 您可能需要对其进行重新排序以将其用作默认参数。

答案 1 :(得分:16)

改为使用常规方法重载:

public static void DatesToPeriodConverter(DateTime start, out string date, out string time)
{
    DatesToPeriodConverter(start, DateTime.MinValue, out date, out time);  
}

public static void DatesToPeriodConverter(DateTime start, DateTime end, out string date, out string time) 
{ }

atlernative,default(DateTime)DateTime.MinValue相同并且是编译时常数,但我倾向于不使用此样式(将来不能保证default(DateTime)将等于{ {1}}):

DateTime.MinValue

或者正如Marc建议的那样,使用允许public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time) 默认值的DateTime?

答案 2 :(得分:4)

您可以尝试这样做:

public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
    if(!end.HasValue){
        end = DateTime.MinValue;
    }
}

答案 3 :(得分:3)

将参数end的类型更改为Nullable,并使用null作为默认值:

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null, out string date, out string time)

或使用默认值(DateTime)作为默认值:

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)

答案 4 :(得分:2)

你是对的。 value的默认参数必须是编译时常量。编译器不接受可选参数的动态计算值。这背后的原因可能是,您提供的动态值不能确定是否会给出一些有效的值。

答案 5 :(得分:1)

可选参数必须出现在参数列表的末尾。 out 参数也必须出现在参数列表的末尾。您的可选参数不是 out 参数。

此外,除了文字常量和一些奇怪的角落情况之外,您不能使用默认值作为可选参数。

所有事实都指向以下方向:

  • 创建辅助重载方法。
  • 使初始方法不包含参数
  • 使辅助一个包含参数
  • 从更具体的方法中调用您更通用的方法(带参数的) 并且仅在更一般的逻辑中实现逻辑

答案 6 :(得分:-1)

我们可以使用默认值

创建CONSTANTS类

public const int DEFAULTINT = -9999;

并将它们用作CONSTANTS.DEFAULTINT作为业务默认值..

希望它有所帮助,