Mik*_*ras 118 c# timespan default-value optional-parameters c#-4.0
这两个都会产生错误,说它们必须是编译时常量:
void Foo(TimeSpan span = TimeSpan.FromSeconds(2.0))
void Foo(TimeSpan span = new TimeSpan(2000))
Run Code Online (Sandbox Code Playgroud)
首先,有人可以解释为什么在编译时无法确定这些值吗?有没有办法为可选的TimeSpan对象指定默认值?
Jos*_*osh 165
您可以通过更改签名轻松解决此问题.
void Foo(TimeSpan? span = null) {
if (span == null) { span = TimeSpan.FromSeconds(2); }
...
}
Run Code Online (Sandbox Code Playgroud)
我应该详细说明 - 您的示例中的表达式不是编译时常量的原因是因为在编译时,编译器不能简单地执行TimeSpan.FromSeconds(2.0)并将结果的字节粘贴到已编译的代码中.
例如,考虑您是否尝试使用DateTime.Now.DateTime.Now的值每次执行时都会更改.或者假设TimeSpan.FromSeconds考虑了重力.这是一个荒谬的例子,但编译时常量的规则并不是因为我们碰巧知道TimeSpan.FromSeconds是确定性的而造成特殊情况.
pho*_*oog 29
我的VB6遗产让我感到不安,认为"空值"和"缺失值"是等价的.在大多数情况下,它可能很好,但是您可能会产生意想不到的副作用,或者您可能会吞下异常条件(例如,如果源span是属性或变量,不应该为null,但是).
因此我会重载该方法:
void Foo()
{
Foo(TimeSpan.FromSeconds(2.0));
}
void Foo(TimeSpan span)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
小智 21
这很好用:
void Foo(TimeSpan span = default(TimeSpan))
Jar*_*Par 15
可用作默认值的值集与可用于属性参数的值相同.原因是默认值被编码到内部的元数据中DefaultParameterValueAttribute.
至于为何在编译时无法确定.在编译时允许的值和表达式集合在官方C#语言规范中列出:
C#6.0 - 属性参数类型:
属性类的位置和命名参数的类型仅限于属性参数类型,它们是:
- 其中以下类型:
bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort.- 类型
object.- 类型
System.Type.- 枚举类型.
(如果它具有公共可访问性,并且它嵌套的类型(如果有的话)也具有公共可访问性)- 上述类型的一维阵列.
该类型TimeSpan不适合任何这些列表,因此不能用作常量.
naw*_*fal 12
void Foo(TimeSpan span = default(TimeSpan))
{
if (span == default(TimeSpan))
span = TimeSpan.FromSeconds(2);
}
Run Code Online (Sandbox Code Playgroud)
提供default(TimeSpan)的不是函数的有效值.
要么
//this works only for value types which TimeSpan is
void Foo(TimeSpan span = new TimeSpan())
{
if (span == new TimeSpan())
span = TimeSpan.FromSeconds(2);
}
Run Code Online (Sandbox Code Playgroud)
提供new TimeSpan()的不是有效值.
要么
void Foo(TimeSpan? span = null)
{
if (span == null)
span = TimeSpan.FromSeconds(2);
}
Run Code Online (Sandbox Code Playgroud)
考虑到null价值是函数的有效值的机会很少,这应该更好.
小智 5
TimeSpan是 的特例,DefaultValueAttribute并且使用可以通过该TimeSpan.Parse方法解析的任何字符串指定。
[DefaultValue("0:10:0")]
public TimeSpan Duration { get; set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39442 次 |
| 最近记录: |