值的默认参数必须是编译时常量
本文关键字:编译 常量 默认 参数 | 更新日期: 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;
并将它们用作常量。默认作为业务默认值。.
希望对您有所帮助,