defaultValue параметра в C # - PullRequest
1 голос
/ 14 ноября 2010

У меня есть следующий класс Schedule и с использованием .Net Framework 4.0.
у этого класса есть два конструктора, оба имеют параметр interval со значением по умолчанию 120 секунд.Есть ли способ установить значение по умолчанию для интервала в частной переменной, а затем присвоить эту переменную параметру интервала.Я пытался сделать это, но я получаю сообщение об ошибке компиляции, говорящее 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 ]

3 голосов
/ 14 ноября 2010

Нет, потому что способ, которым работают необязательные параметры, заключается в том, что компилятор , вызывающий код , имеет значение по умолчанию.Поэтому вызов, подобный этому:

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

Если вы хотите, чтобы значение, которое может изменяться во время выполнения, вы могли бы использовать в качестве параметра обнуляемый тип с нулевым значением по умолчанию, заменяемым real по умолчанию во время выполнения.Например, вот метод, который позволяет вам указать метку времени, но по умолчанию «сейчас»:

public void Foo(DateTime? timestamp = null)
{
    DateTime realTimestamp = timestamp ?? DateTime.UtcNow;
    ...
}
0 голосов
/ 14 ноября 2010

Нет способа иметь динамическое значение в качестве параметра по умолчанию. Это должно быть известно во время компиляции. Фактически это тот же набор значений, который можно использовать в качестве параметра по умолчанию, как для аргументов атрибута, поскольку значения параметров по умолчанию передаются как атрибут DefaultParameterValueAttribute .

Вы можете использовать константу:

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

}

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

}
...