C# 4默认参数值:如何分配默认的DateTime/Object值?

104

如果DateTime是一个对象且默认的C#参数只能被编译时常量所赋值,那么如何为像DateTime这样的对象提供默认值?

我正在尝试使用带有默认值的命名参数,通过构造函数来初始化POCO中的值。


1
调用一个设置参数的重载方法:https://dev59.com/o3A75IYBdhLWcg3w7tt6#3031309 - CAD bloke
6个回答

190

DateTime 不能用作常量,但你可以将其变为可空类型 (DateTime?)。

DateTime? 设置为默认值 null,如果在函数开始时它被设置为 null,那么你可以将它初始化为任何值。

static void test(DateTime? dt = null)
{
    if (dt == null)
    {
        dt = new DateTime(1981, 03, 01);
    }

    //...
}
你可以像这样使用命名参数进行调用:
test(dt: new DateTime(2010, 03, 01));

并且使用默认参数,就像这样:

test();

3
DateTime.MinValue是什么? - Zachary Scott
2
@Dr.Zim:不,它是只读的,但不是常量。 - Brian R. Bondy
为什么DateTime.MinValue不是编译时常量呢? - Zachary Scott
@Dr.Zim: 因为DateTime不能被声明为const。我不知道为什么会这样。 - Brian R. Bondy
19
你可以使用以下代码:DateTime dt = default(DateTime) - Sebastian
如果(!dt.HasValue)开始日期=新的DateTime(2010, 03, 01); - Dale Fraser

60

唯一可以直接这样做的方法是使用编译时常量值 default(DateTime)。或者你可以通过使用 DateTime? 并将默认值设置为 null 来解决这个问题。

关于 TimeSpan 的可选参数和默认值,也可以参考这个相关问题


正是我所需要的。有时使用DateTime?会更加混乱。 - pettys
谢谢。@Dr. Zim的default或minvalue对我很有用。但是我更喜欢default。这让我省去了再发另一个问题的麻烦! :) - nawfal

8

new DateTime()也等同于DateTime.MinValue。

你可以这样创建一个默认参数。

void test(DateTime dt = new DateTime())
{
//...
}

1
无法工作,您不能在默认参数中使用函数。 - Kirbinator
1
@Kirbinator,它有效,请尝试。 - conical
我简直不敢相信这样做居然编译通过了。不过,我还没有看到它在运行时是否正常。 - Mickael Caruso
1
由于DateTime是结构体,所以它会起作用。 - Natan Braslavski

4

C#不支持日期字面量,与VB不同。而且由于可选参数在IL中的表现形式,你不能使用属性来模拟它。

.method private hidebysig static void foo([opt] int32 x) cil managed
{
    .param [1] = int32(5)
    .maxstack 8
    L_0000: nop 
    L_0001: ret 
}



.method //this is a new method
private hidebysig static //it is private, ???, and static
void foo  //it returns nothing (void) and is named Foo
([opt] int32 x) //it has one parameter, which is optional, of type int32

.param [1] = int32(5) //give the first param a default value of 5

你能解释一下这段代码吗? - Jom George
好的,谢谢 :) 日期时间也可以像.param [1] = DateTime(5)一样给出。 - Jom George

-1
private System.String _Date= "01/01/1900";
public virtual System.String Date
{
   get { return _Date; }
   set { _Date= value; }
}

我们可以像下面这样给标签赋值,
lblDate.Text = Date;

我们也可以获取这个值,

DateTime dt = Convert.ToDateTime(label1.Text);

仍然不能用作参数。没有回答问题。 - Gucu112

-3

你可以使用:

Datetime.MinValue

用于初始化。


1
无法回答该问题,因为您无法将其设置为默认值,因为它不是常量。 - Paul Hatcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接