DateTime可选参数中的默认值应该是多少?

Lou*_*hys 25 .net c# datetime optional-parameters

通常,如果我有可选参数的可空类型,我会将null作为默认值.这样我知道如果值为null,则调用者不希望为该值指定任何值.

public void Foo(string text, string text2= null);
Run Code Online (Sandbox Code Playgroud)

如果参数通常是正整数,我可以使用负数

public void Foo(string text, int index=-1);
Run Code Online (Sandbox Code Playgroud)

DateTime怎么样?它不是可空的,并且(据我所知)它没有无意义的数字,也不能成为真正的输入(如正整数的-1).还是有吗?在这种情况下你会用什么?

我也知道我可以使用可空DateTime类型,但这意味着方法调用者必须使用Nullable以及反对只是方便地传递DateTime.

Ada*_*rth 34

您可以使用?C#中的运算符使值类型为空:

DateTime? myDate = null;

从这里,您可以使参数可选:

void Foo(DateTime? myDate = null)
{
}
Run Code Online (Sandbox Code Playgroud)

关于Nullable类型的进一步阅读.

这不是皮肤猫然而,你可以使用的唯一方法default(DateTime),但是你不能使用DateTime.MinValue,MaxValueNow在可选参数,因为它们不是编译时间常数.

当然,您不需要使用可选参数,如果您希望使用Min,Max或Now,则可以使用重载方法.

void Foo()
{
    Foo(DateTime.MinValue);
}

void Foo(DateTime d)
{
}
Run Code Online (Sandbox Code Playgroud)

如果你想过度杀戮(好吧,也许不是矫枉过正,有很多正当理由这样做),那么你可以定义一个新的日期类型,它可以理解它何时有一个值:

class SmarterDateTime
{
    public bool IsSet { get; set; }

    // Wrapper around DateTime etc excluded.
}
Run Code Online (Sandbox Code Playgroud)

至于应该是什么默认值,你可以选择让任何日期代表默认值,但是对于像可选参数这样的东西你会有限制.

就个人而言,我倾向于使用DateTime.MinValue.

  • @LouisRhys:没有明确表示他们不会 - 从`DateTime` 到`DateTime?` 的隐式转换。 (2认同)
  • @LouisRhys:使用`ref` 参数就是这种情况,或者如果你正在*获取*一个`DateTime?` 值并试图将它分配给一个`DateTime` 变量。 (2认同)
  • @LouisRhys:嗯,它不会是一个 *binary* 兼容的变化,还有一些其他的极端情况(代表的方法组转换),但对于“正常”方法调用它应该没问题。 (2认同)

Vas*_*sya 15

default(DateTime) - 运算符默认值适用于它

  • 对于其他想知道的人来说,实际值是:`1-1-0001 0:00:00` (2认同)
  • 它相当于`DateTime.MinValue`(第一年正月第一天的午夜)。 (2认同)

xan*_*tos 7

在"什么可以是DateTime的默认值"的问题上,响应必须是:您只能使用default(DateTime).这是因为默认值必须是const两者DateTime.MinValueDateTime.MaxValuestatic readonly,但要注意

default(DateTime) == DateTime.MinValue
Run Code Online (Sandbox Code Playgroud)

到了Kind.

如果你想要你可以用一个较少的参数(DateTime)来实现一个重载,并从那个重载调用"main"方法传递你喜欢的值.

但正如其他人所写,问题是你写错了前提.

不,DateTime(几乎所有的ValueTypes.几乎所有因为Nullable<Nullable<int>>非法,即使Nullable<T>是a ValueType)都可以为空.Nullable<DateTime>DateTime?(同样的事情)

int你知道,即使是可空的吗?int?:-)


hun*_*ind 5

DateTime.MinValue 将是默认值.