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

本文关键字:编译 常量 默认 参数 | 更新日期: 2023-09-27 18:30:52

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

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

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

>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;
    // ...
}

但是,您仍然会遇到默认参数具有非默认参数的问题 - 您可能需要重新排序它们以将其用作默认值。

改用常规方法重载:

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) 
{ }

从本质上讲,default(DateTime)DateTime.MinValue 相同并且是编译时常数,但我倾向于错误地不使用这种风格(将来不能保证default(DateTime)等于 DateTime.MinValue):

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

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

您可以尝试这样做:

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

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

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

或使用默认值(日期时间)作为默认值:

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

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

可选参数必须出现在参数列表的末尾。out 参数还必须显示在参数列表的末尾。可选参数不是 out 参数。

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

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

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

此错误也可能发生在列表上:

CS1736 "dateTimes"的默认参数值必须是编译时不断

public YourEntity(dateTimes = new List<DateTime>())
{
    DateTimes = dateTimes;
}
public List<DateTime> DateTimes { get; set; } = new List<DateTime>();

然后你可以这样解决它:

public YourEntity(dateTimes = null)
{
    DateTimes = dateTimes != null ? dateTimes : new List<DateTime>();
}
public List<DateTime> DateTimes { get; set; } = new List<DateTime>();

我们可以用默认值创建 CONSTANTS 类

public const int DEFAULTINT = -9999;

并将它们用作常量。默认作为业务默认值。.

希望对您有所帮助,