.net value的默认参数必须是编译时常量?

gudnpqoy  于 2023-05-02  发布在  .NET
关注(0)|答案(8)|浏览(240)

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

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

xv8emn3q1#

DateTime.MinValue不是const,因为语言不喜欢DateTime上的const。一种选择是使用DateTime?代替,即:e.

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

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

sh7euo9m

sh7euo9m2#

请改用常规方法重载:

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?,它允许使用null默认值。

izkcnapc

izkcnapc3#

你可以试着这样做:

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

7cjasjjr4#

将参数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)
tjjdgumg

tjjdgumg5#

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

yyyllmsg

yyyllmsg6#

可选参数必须出现在参数列表的末尾。out 参数也必须出现在参数列表的末尾。您的可选参数不是 out 参数。
此外,除了文字常量和一些奇怪的情况之外,您不能为可选参数使用默认值。
所有事实都指向以下方向:

  • 创建辅助重载方法。
  • 使初始方法不包括参数
  • 使次要的一个包括参数
  • 从更具体的方法调用更一般的方法(带参数的方法),只在更一般的方法中实现逻辑
gkn4icbw

gkn4icbw7#

此错误也可能发生在列表中:
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>();
wgx48brx

wgx48brx8#

我们可以用默认值创建CONSTANTS类
public const int DEFAULTINT = -9999;
并将其用作常量。DEFAULTINT作为业务默认值。.
希望能有所帮助,

相关问题