C#中参数的defaultValue

时间:2010-11-14 08:45:18

标签: c# .net-4.0

我有以下Schedule课并使用.Net Framework 4.0 此类有两个构造函数,两个构造函数的参数均为interval,默认值为120秒。有没有办法在私有变量中设置interval的默认值,然后将该变量赋值给interval参数。我尝试过这样做,但是我收到编译时错误Default parameter value for 'interval' must be a compile-time constant

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)
    {

    }
}

2 个答案:

答案 0 :(得分:3)

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

new Schedule(MyCallback)

在编译时将转换为

new Schedule(MyCallback, 120)

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

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值是默认值,在执行时由 real 默认值替换。例如,这是一个允许您指定时间戳的方法,但默认为“now”:

public void Foo(DateTime? timestamp = null)
{
    DateTime realTimestamp = timestamp ?? DateTime.UtcNow;
    ...
}

答案 1 :(得分:0)

无法将动态值作为默认参数。它应该在编译时知道。实际上,它是可以用作属性参数的默认参数的同一组值,因为默认参数值是作为DefaultParameterValueAttribute属性发出的。

您可以使用常量:

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

}

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

}