72

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

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

7 回答 7

94

DateTime.MinValue不是 a const,因为语言不喜欢conston DateTime。一种选择是DateTime?改用,即

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

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

于 2013-09-11T11:54:01.590 回答
24

改用常规方法重载:

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 建议的那样,使用DateTime?which 允许null默认值。

于 2013-09-11T11:53:52.010 回答
7

您可以尝试这样做:

public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
    if(!end.HasValue){
        end = DateTime.MinValue;
    }
}
于 2013-09-11T11:57:53.873 回答
5

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

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

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

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
于 2013-09-11T11:56:26.330 回答
3

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

于 2013-09-11T11:56:24.480 回答
2

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

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

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

  • 创建辅助重载方法。
  • 使初始方法不包含参数
  • 使第二个包含参数
  • 从更具体的方法中调用更通用的方法(带有参数的方法)并仅在更通用的方法中实现逻辑
于 2013-09-11T11:56:39.040 回答
-3

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

公共常量 int DEFAULTINT = -9999;

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

希望能帮助到你,

于 2013-12-03T15:45:28.277 回答