5

Heute schrieb ich ein kleines Programm, um die Grundlagen der optionalen Parameter von C# zu verstehen.Nicht in der Lage, die Ausgabe von Methoden mit optionalen Parameter zu verstehen

Im Anschluss an das Programm:

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)); 
    } 
} 

Dies ist, wie ich Test() Methode genannt:

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

Ausgang:

In DerivedClass.Test (int a = 1) Methode 1

In DerivedClass.Test (int a = 1) Methode 6

In DerivedClass.Test (int b, int a = 1) Verfahren 7 1

d.Test(); Bezug: Hier mein Verständnis ist, wird es behandeln Test() als Verfahren mit einem optionalen Parameter, und wird mit diesem Ausgang Test(int a = 1) aufzurufen:

In DerivedClass.Test (int a = 1) Methode 1

0.123.

Aber das ist, was mir verwirrt, wenn d.Test(6); Ausführung: Warum dieser Methodenaufruf gibt nicht ausgegeben als:

In DerivedClass.Test (int b, int a = 1) Methode 6 1

gemäß meinem Verständnis „6“ ist der obligatorische Parameter und es sollte

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

Bitte rufen sie erklären, was mit meinem Verständnis falsch ist.

Wie kann man eine überschriebene Methode aufrufen?

internal override void Test() 
+3

Warum sollte 'Test (6)' 'Test aufrufen (int b, int a = 1)'? Es gibt bereits eine passende Methode 'Test (int a = 1)', die mit 'a' auf' 6' gesetzt wird. –

+0

Bitte beachten Sie ["Sollten Fragen enthalten" -Tags "in ihren Titeln?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles), wo der Konsens ist "nein, sollten sie nicht"! –

+1

@Dennis_E Aber warum heißt 'Test (int a = 1)' im ersten Fall wenn es eine viel bessere Übereinstimmung ohne Params gibt? – HimBromBeere

Antwort

0

Die Regeln um optionale Parameter kann ein wenig verwirrend, aber eine einfache Daumenregel sein, daran zu erinnern, dass es immer eine Methode mit weniger Parameter in den Vorzug eines mit mehr verwenden werden.

Also für

d.Test(6); 

das Verfahren mit nur einem Parameter:

internal void Test(int a = 1) 

verwendet werden, auch wenn es ein optionaler Parameter ist.

+1

Könnten Sie bitte einige Dokumente zu diesem Thema bereitstellen? Die MSDN-Seite für Named und Optional Arguments scheint mir nicht sehr klar. –

6

Die Regel passend für internal void Test(int a = 1) entspricht Ihrem Code d.Test(6); am besten: es passt auf die Anzahl der Argumente, die Typen. Das macht die Methode am besten.

Wenn Sie d.Test(b:7); aufrufen, erzwingen Sie, dass es als letzte Methode ausgeführt wird, da Sie den Namen des Parameters abgleichen.Das macht die letzte Methode zur besten.

Die erste (d.Test();) stimmt nicht mit der von Ihnen erwarteten Methode überein (void Test()), da 'eigene' Methoden den abgeleiteten Methoden vorgezogen werden. Versuchen Sie, die Basisklasse zu entfernen, oder verwenden Sie den Operator new für die Methode, und Sie werden sehen.

Verwandte Themen