2010-11-14 4 views
1

У меня есть следующий класс Schedule и с использованием .Net Framework 4.0.
Этот класс имеет два конструктора, оба из которых имеют параметр interval со значением по умолчанию 120 секунд. есть ли способ установить значение интервала по умолчанию в частной переменной, а затем назначить эту переменную параметру интервала. Я пытался сделать это, но я получаю ошибку компиляции времени, говоря Default parameter value for 'interval' must be a compile-time constantdefaultValue параметра в C#

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

    } 
} 

ответ

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

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

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

ой хорошо, я попытался принимая приватную переменную, но это был 'variable' вместо' constant'. спасибо, Это помогло. – 2010-11-14 09:08:54

0

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

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

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

} 

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

} 
+0

спасибо, это было полезно. – 2010-11-14 09:09:15

Смежные вопросы