2013-06-30 12 views
6

Dziś odkryłem coś dziwnego. Zastanawiam się, dlaczego to działa:Przeciążenie metody C# z parametrami i opcjami

static void Main(string[] args) 
{ 
    Console.WriteLine(ExampleMethod(3)); 
    Console.ReadKey(); 
} 

public static string ExampleMethod(int required, params int[] optionalint) 
{ 
    return "ExampleMethod 2"; 
} 

public static string ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10) 
{ 
    return "ExampleMethod 1"; 
} 

Pomyśl o tym: Jaki jest wynik, gdy zadzwonisz ExampleMethod (3);

Moim zdaniem prowadzi to do nieprzewidywalnego wyniku. W moim przypadku zawsze nazywano metodę 1. Ale gdy zmieniłem podpis metody 1, główna metoda nazywa się metodą 2 (oczywiście).

Nie oczekiwałem takiego zachowania, oczekiwałem "wyjątku AmbiguousReferenceException" lub przynajmniej ostrzeżenia kompilatora.

+0

Krótka odpowiedź: ponieważ specyfikacja mówi tak. http://www.microsoft.com/en-us/download/details.aspx?id=7029 –

Odpowiedz

5

Spodziewam się tego zachowania, ponieważ kompilator zna wartości domyślne optionalstr i optionalint i dlatego jest w stanie podjąć decyzję na podstawie wartości, których należy użyć. Nie wiedziałby, co ustawić jako wartość dla int[] optionalint. Ponieważ kompilator jest "bardziej pewny" tego, co używać, gdy masz opcjonalne parametry, wywołuje tę metodę.

Jeśli dodano dodatkową metodę jak to

public static string ExampleMethod(int required) 
{ 
    return "ExampleMethod 3"; 
} 

Byłby to metoda zwana ponieważ kompilator trafi do metody, która ma pierwsze nie opcjonalne parametry.

More detailed explanation o rozdzielczości przeciążenia.

+0

Zasady, dla których rozdzielczość przeładowania są dość szczegółowe. Ta odpowiedź na podobne pytanie zawiera więcej informacji: http://stackoverflow.com/questions/3190248/how-does-c-sharp-choose-with-ambiguity-and-params –

+0

Dzięki, dodałem link do odpowiedź. – keyboardP

+0

aaah, ok, to ma sens. Dziękuję Ci. Nie myślałem dotąd, że w jednej wersji parametry były domyślnie ustawione. – baschdy

Powiązane problemy