【问题标题】:C# 4 default parameter values: How to assign a default DateTime/object value? [duplicate]C# 4 默认参数值:如何分配默认日期时间/对象值? [复制]
【发布时间】:2011-02-23 02:02:52
【问题描述】:

如果 DateTime 是一个对象,并且默认 C# 参数只能分配编译时常量,那么如何为 DateTime 之类的对象提供默认值?

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

【问题讨论】:

标签: c# default-parameters


【解决方案1】:

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();

【讨论】:

  • DateTime.MinValue 怎么样?
  • @Dr.Zim:不,它是只读的,但不是常量。
  • 为什么 DateTime.MinValue 不是编译器时间常数?
  • @Dr. Zim:因为 DateTime 不能声明为 const。我不知道为什么会这样。
  • 你可以使用:DateTime dt = default(DatetTime)
【解决方案2】:

您可以直接执行此操作的唯一方法是使用值default(DateTime),它是编译时常量。或者您可以通过使用DateTime? 并将默认值设置为null 来解决此问题。

另见this related question about TimeSpan

【讨论】:

  • 正是我想要的。有时使用日期时间?更混乱。
  • 谢谢.. @Dr 的默认值或最小值。 Zim 帮我解决了这个问题。但默认是我喜欢的。让我免于发布另一个问题! :)
【解决方案3】:

new DateTime() 也等于 DateTime.MinValue

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

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

【讨论】:

  • 不起作用,不能在默认参数中使用函数。
  • @Kirbinator 试试看。
  • 当我这样做时,我不敢相信它会编译。不过,我还没有看到它在运行时是否会正常。
  • 因为它是 DateTime 结构,所以它会工作。
【解决方案4】:

与 VB 不同,C# 不支持日期文字。而且由于可选参数在 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

【讨论】:

  • 你能解释一下这段代码吗?
  • 好的,谢谢 :) 日期时间我们也可以像 .param [1] = DateTime(5) 一样给出相同的方式?
【解决方案5】:
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);

【讨论】:

  • 仍然不能用作参数。不回答问题。
【解决方案6】:

你可以使用:

Datetime.MinValue

用于初始化。

【讨论】:

  • 不回答问题,因为您不能将其设置为默认值,因为它不是常量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2013-01-22
  • 2012-05-04
相关资源
最近更新 更多