2014-10-07 19 views
6

EDYCJA 1: Wiem, że istnieją alternatywy, takie jak teleskopowanie, to było pytanie wyłącznie edukacyjne.Dlaczego domyślne parametry metody muszą być stałymi w czasie kompilacji C#

Wiem, że to prawda, ale dlaczego tak się dzieje? Wydaje się, ze coś takiego:

public class Foo{ 

    private int bar; 

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

} 

Kompilator może zmienić sposób, aby coś takiego:

public void SetBar(int baz){ 

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

this.bar = baz; 

} 

dlaczego nie tej pracy, czy byłoby to, i to tylko decyzja projektowa ?

+0

ponieważ może wystąpić różnica między wartościami wykonawczymi a wartościami czasu kompilacji. co jeśli koder chciałby, aby wartość kompilacji była "zakodowana", ale GetBaz() zwraca coś zupełnie innego w czasie wykonywania i wyrzuca program z walnięcia? –

+5

Jeśli chcesz wiedzieć, dlaczego zespół językowy C# nie zaimplementował funkcji, zapytaj ich, zamiast losowych programistów, którzy nie mieli nic wspólnego z tworzeniem języka. Nie wiemy, dlaczego zdecydowali się nie wdrażać tej funkcji. – Servy

+1

zawsze masz możliwość przeciążenia metody –

Odpowiedz

7

Ponieważ spec mówi tak:

stałą parametr z domyślnym-argumentem jest znany jako opcjonalny parametru, natomiast stałym parametrem bez default-argument jest wymagane parametry. Wymagany parametr może nie pojawić się po opcjonalnym parametrze na liście parametrów formalnych. Parametr ref lub out nie może mieć argumentu domyślnego. Ekspresja w domyślnej dwuargoomentowe musi być jednym z następujących:

• stałej ekspresji

• wyrazem tworzenia nowych S(), w którym S oznacza typ wartości

; • wyrażenie domyślnej formy (S), gdzie S jest typem wartości

Jeśli chodzi o to, dlaczego projektanci języka zdecydowali się to zrobić, możemy się jedynie domyślać. Jednak kolejny kawałek spec wskazuje na odpowiedź:

Kiedy argumenty są pominięte członka funkcji z odpowiednimi parametry opcjonalne argumenty domyślne funkcji deklaracji członek są przekazywane w sposób dorozumiany. Ponieważ są one zawsze stałe, ich ocena nie wpłynie na kolejność oceny pozostałych argumentów: .

+0

taaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: jeśli użyjesz metod jako wartości domyślnych, którą kolejność należy wykonać, jeśli masz więcej niż jedną wartość domyślną iw którym czasie –