5

Dzisiaj pisałem mały program, aby zrozumieć podstawy opcjonalnych parametrów języka C#.Nie można zrozumieć wyników metod z Opcjonalnym parametrem

Poniżej program:

abstract class AbstractClass 
{ 
    internal abstract void Test(); 
} 

sealed class DerivedClass : AbstractClass 
{   
    internal override void Test() 
    { 
     Console.WriteLine("In override DerivedClass.Test() method"); 
    } 

    internal void Test(int a = 1) 
    { 
     Console.WriteLine("In DerivedClass.Test(int a=1) method " + a); 
    } 

    internal void Test(int b, int a = 1) 
    { 
     Console.WriteLine("In DerivedClass.Test(int b, int a=1) method " + string.Format("{0} {1}", b, a)); 
    } 
} 

To jak zadzwoniłem Test() metody:

DerivedClass d = new DerivedClass();  
    d.Test(); 
    d.Test(6); 
    d.Test(b:7); 

wyjściowa:

W DerivedClass.Test (int a = 1) metoda 1

W DerivedClass.Test (int a = 1) Metoda 6

W DerivedClass.Test (Int b a = 1 int) Metoda 7 1

chodzi d.Test();: Tutaj mi się, to będzie Test() traktować jako metoda z opcjonalnym parametr i wywoła Test(int a = 1) tym wynikiem:

W DerivedClass.Test (int a = 1) metoda 1

Ale to co mnie dezorientuje podczas wykonywania d.Test(6);: Dlaczego ta metoda połączenia nie daje wyjście jak:

W DerivedClass.Test (int b, int a = 1) Metoda 6 1

Jak na moje rozumienie „6” to parametr obowiązkowy i powinien powołać

internal void Test(int b, int a = 1) 

łaskawie wyjaśnić, co jest nie tak z moim zrozumieniem.

Również jak wywołać metodę overriden?

internal override void Test() 
+3

Dlaczego "Test (6)" należy wywołać 'Test (int b, int a = 1)'? Istnieje już metoda "Test (int a = 1)", która jest wywoływana przez 'a' ustawiony na' 6'. –

+0

Zobacz ["Czy pytania powinny zawierać" znaczniki "w tytułach?] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), gdzie konsensus jest "nie, nie powinni"! –

+1

@Dennis_E Ale dlaczego "Test (int a = 1)" jest wywoływany w pierwszym przypadku, gdy istnieje dużo lepsze dopasowanie bez żadnych parametrów? – HimBromBeere

Odpowiedz

0

Zasady wokół opcjonalnych parametrów może być trochę mylące, ale to prosta zasada do zapamiętania jest to, że będzie ona zawsze stosować metodę z mniej parametrów w preferencji do jednego z bardziej.

Więc dla

d.Test(6); 

metoda z tylko jednego parametru:

internal void Test(int a = 1) 

będą stosowane, mimo że jest parametrem opcjonalnym.

+1

Czy możesz podać kilka dokumentów związanych z tym? Strona MSDN dotycząca argumentów o nazwie i opcjonalnych nie wydaje mi się zbyt jasna. –

6

Dopasowanie reguły dla internal void Test(int a = 1) pasuje do Twojego kodu d.Test(6); najlepiej: pasuje do liczby argumentów, typów. To sprawia, że ​​metoda jest najlepsza.

Wywołując d.Test(b:7);, zmuszasz go do uruchomienia jako ostatnia metoda, ponieważ dopasowujesz nazwę parametru.To sprawia, że ​​ostatnia metoda jest najlepiej dopasowana.

Pierwsza (d.Test();) nie pasuje do oczekiwanej metody (void Test()), ponieważ metody "własne" są preferowane w stosunku do metod pochodnych. Spróbuj usunąć klasę podstawową lub użyj operatora new w metodzie, a zobaczysz.