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

Ank*_*kit 48 .net c# parameters

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

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue,
                                          out string date, out string time)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 71

DateTime.MinValue不是const,因为语言不喜欢constDateTime.一种选择是使用DateTime?,即

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

但是,在默认参数之后仍然存在非默认参数的问题- 您可能需要重新排序它们以将其用作默认参数.

  • @student我在这里使用了几个; `DateTime?`表示`Nullable <DateTime>`,意思是"一个值可以是`DateTime`或`null`"; `??`是null-coalescing运算符,这意味着(在此上下文中):取第一个非null值,即如果它是非null则取'end`,否则取'DateTime.MinValue` (5认同)
  • 我认为这是最好的解决方案.我通常更喜欢使用null而不是.MinValue/.MaxValue和其他"魔术"值作为默认值.它更清晰,更不容易出错且更精确:null表示没有给出任何值.不多也不少. (4认同)

Ada*_*rth 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) 
{ }
Run Code Online (Sandbox Code Playgroud)

atlernative,和编译时间default(DateTime)一样,DateTime.MinValue并且是编译时间常数,但是我倾向于使用这种风格(以后不能保证default(DateTime)等于DateTime.MinValue):

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
Run Code Online (Sandbox Code Playgroud)

或者正如Marc建议的那样,使用DateTime?允许null默认值.

  • 旁白:有趣的是`= default(DateTime)`*在这里工作,当`const DateTime x = default(DateTime);`do*not*. (3认同)

Ada*_*ski 7

您可以尝试这样做:

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


Via*_*nov 5

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

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null, out string date, out string time)
Run Code Online (Sandbox Code Playgroud)

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

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
Run Code Online (Sandbox Code Playgroud)