C# C中参数的默认值#

C# C中参数的默认值#,c#,.net-4.0,C#,.net 4.0,我使用.netframework4.0 这个类有两个构造函数,都有一个默认值为120秒的interval参数。有没有办法在私有变量中设置interval的默认值,然后将该变量指定给interval参数。我尝试过这样做,但是我得到了一个编译时错误,说“interval”的默认参数值必须是编译时常量 public class Schedule { public Delegate Callback { get; set; } public object[] Params { get;

我使用
.netframework4.0

这个类有两个构造函数,都有一个默认值为120秒的
interval
参数。有没有办法在私有变量中设置interval的默认值,然后将该变量指定给interval参数。我尝试过这样做,但是我得到了一个编译时错误,说“interval”的默认参数值必须是编译时常量

public class Schedule
{
    public Delegate Callback { get; set; }
    public object[] Params { get; set; }
    public int Interval { get; set; }

    public Schedule(Delegate callback, int interval = 120)
    {

    }

    public Schedule(Delegate callback, object[] parameters, int interval = 120)
    {

    }
}

不,因为可选参数的工作方式是调用代码的编译器将默认值烘焙到其中。这样的电话:

new Schedule(MyCallback)
在编译时转换为:

这就是为什么它必须是一个常数。现在,你仍然可以把它设为常数——如果你愿意,甚至可以设为私有变量——但它不能是一个普通变量。所以这没关系:

public class Schedule
{
    private const int DefaultInterval = 120;

    public Schedule(Delegate callback, int interval = DefaultInterval)
    {

    }

    public Schedule(Delegate callback, object[] parameters,
                    int interval = DefaultInterval)
    {
         ...
    }
}
如果您想要一个在执行时可能会变化的值,可以使用一个可为null的类型作为参数,其中null值是默认值,在执行时由实际默认值替换。例如,这里有一个方法允许您指定时间戳,但默认为“now”:


无法将动态值作为默认参数。它应该在编译时就知道了。事实上,可以用作默认参数的值集与用作属性参数的值集相同,因为默认参数值作为属性发出

您可以使用一个常量:

private const int DefaultInterval = 120;
public Schedule(Delegate callback, int interval =DefaultInterval)
{

}

public Schedule(Delegate callback, object[] parameters, int interval = DefaultInterval)
{

}

哦,很好,我尝试使用一个私有变量,但那是
变量
而不是
常量
。谢谢,这很有帮助。
public void Foo(DateTime? timestamp = null)
{
    DateTime realTimestamp = timestamp ?? DateTime.UtcNow;
    ...
}
private const int DefaultInterval = 120;
public Schedule(Delegate callback, int interval =DefaultInterval)
{

}

public Schedule(Delegate callback, object[] parameters, int interval = DefaultInterval)
{

}