这是我的方法签名。在尝试将end
作为可选参数传递时,它会给我这个错误。我该怎么做才能解决这个问题?为什么DateTime.MinValue
不是常数?
public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue,
out string date, out string time)
答案 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作为业务默认值..
希望它有所帮助,