2017-04-13 97 views
2

C#4.0的答案不再适用。 < - (对不起,这是错误的)我可以使用TimeSpan作为具有默认值的可选参数吗?

我该如何使用TimeSpan作为默认值的可选参数?

public static Foo(string myString, TimeSpan maxWait = TimeSpan.FromSeconds(1)) 
{ 
    // do something 
} 

有了这个代码,我得到的错误:

default parameter must be a compile-time constant

+0

@Patrick为什么在标题中删除“C#7.0”? – kame

+1

因为它是一个标签,标签不应该是标题的一部分。 –

+1

“C#4的答案不再适用”是什么意思? – Evk

回答

9

这从未在任何C#版本工作。默认值必须是常量。您必须创建一个超载来默认值,或者使其可以为空,并且如果值为null,则默认值。

选项1:

public static Foo(string myString) 
{ 
    Foo(myString, TimeSpan.FromSeconds(1)); 
} 

public static Foo(string myString, TimeSpan maxWait) 
{ 
    // do something 
} 

选项2:

public static Foo(string myString, TimeSpan? maxWait = null) 
{ 
    TimeSpan maxWaitNotNull = maxWait ?? TimeSpan.FromSeconds(1); 
    // do something 
} 
1

不能使用一个TimeSpan作为一个可选参数,这是因为类TimeSpan没有声明任何编译时间常数元件(这意味着TimeSpan s的成员(如TimeSpan.Zero)不是“硬编码”的,但需要进行评估,不能在编译时完成),或者根本不能用作常量。

尝试,如果以下可能会为你工作:

void Foo(TimeSpan? span = null) 
{  
    if (span == null) { span = TimeSpan.FromSeconds(2); }  
    ...  
} 

也应为C#7.0的工作。

取自C# 4.0: Can I use a TimeSpan as an optional parameter with a default value?

+2

您可以始终将'default(TimeSpan)'作为可选参数。 –

+0

@PatrickHofman是的,你说得对,我说这是错误的,我的意思是'TimeSpan.Zero'等成员不是编译时常量成员,可以用作默认值 –

+1

这不仅仅是'TimeSpan'没有声明任何编译时常量 - 实际上你根本不能声明类型为'TimeSpan'的常量。 – Evk

相关问题