2014-10-07 2 views
6

EDIT 1: Я знаю, что есть альтернативы, такие как телескопирование, это был чисто образовательный вопрос.Почему параметры метода по умолчанию должны быть константами времени компиляции в C#

Я знаю, что это правда, но почему это должно быть? Похоже, что-то вроде этого:

public class Foo{ 

    private int bar; 

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){ 
     this.bar = baz; 
    } 

} 

Компилятор может изменить способ что-то вроде этого:

public void SetBar(int baz){ 

//if baz wasn't passed: 
baz = ThatOtherClass.GetBaz(3); 

this.bar = baz; 

} 

Почему бы эту работу, или это, и это просто дизайнерское решение ?

+0

потому что разница между значениями времени выполнения и значениями времени компиляции может быть разной. что, если кодер хотел бы получить значение времени компиляции «hardcoded» там, но GetBaz() затем возвращает что-то совершенно другое во время выполнения и выбрасывает программу из строя? –

+5

Если вы хотите знать, почему команда языка C# не реализовала функцию, задайте ее, а не случайные разработчики, которые не имеют никакого отношения к созданию языка. Мы не можем знать, почему они решили не выполнять эту функцию. – Servy

+1

у вас всегда есть возможность перегрузки метода –

ответ

7

Поскольку спецификация говорит так:

с фиксированным параметром с аргументом по умолчанию-известен в качестве необязательного параметра , в то время как с фиксированным параметром без по умолчанию-аргумента является необходимым параметром. Обязательный параметр может не отображаться после необязательного параметра в списке формальных параметров. Параметр ref или out не может иметь аргумент по умолчанию. Выражение в по умолчанию-аргумента должен быть одним из следующих:

• постоянной экспрессии

• выражение в виде новых S(), где S является типом значения

• выражение формы по умолчанию (S), где S - тип значения

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

Когда аргументы опущены из члена функции с соответствующими необязательных параметрами, аргументы по умолчанию для функции члена декларации неявно передаются. Поскольку они всегда постоянны, их оценка не повлияет на порядок оценки оставшихся аргументов .

+0

Да, это хорошая точка, если вы используете методы в качестве значений по умолчанию, порядок которых должен выполняться этими методами, если у вас более одного значения по умолчанию и в это время –