C# : überladen von Konstruktoren mit optionalen Parametern & benannte Argumente?
Dies ist nicht eine Frage, auf die richtige Codierung der Praxis, ich arbeite einfach durch die Semantik.
können sagen, ich habe die folgenden Konstruktoren...
public FooClass(string name = "theFoo")
{ fooName = name; }
public FooClass(string name, int num = 7, bool boo = true) : this(name)
{ fooNum = num; fooBool = boo; }
ist es möglich, zu verwenden benannte Argumente so...?
FooClass foo1 = new FooClass(num:1);
//wo bin ich nur vorbei an ein benanntes argument, das sich auf die Optionen, um den rest kümmern
oder rufen Sie den Konstruktor FooClass(string, int, bool) ohne Argumente? wie in...
FooClass foo2 = new FooClass();
Wie wäre es versuchen? Haben Sie den code direkt dort... Sie mir sagen, ob es funktioniert!
ok, ich sollte angegeben haben, dass der Beispiel-code funktioniert nicht und ich wollte wissen, wie es funktioniert.
ok, ich sollte angegeben haben, dass der Beispiel-code funktioniert nicht und ich wollte wissen, wie es funktioniert.
InformationsquelleAutor user1229895 | 2012-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von benannten und optionalen Argumenten betrifft überlast Auflösung in der folgenden Weise:
Einer Methode, indexer, oder Konstruktor ist ein Kandidat für die Ausführung, wenn die einzelnen Parameter entweder optional ist oder entspricht, nach Namen oder nach position, um ein einzelnes argument in der aufrufenden Anweisung, und das argument umgewandelt werden können, um den Typ des Parameters.
Wenn mehr als ein Kandidat ist gefunden, überlast Auflösung Regeln für bevorzugte Konvertierungen angewendet werden, um die Argumente explizit angegeben. Ausgelassene Argumente für optionale Parameter werden ignoriert.
Wenn zwei Kandidaten sind beurteilt zu werden, gleich gut, Präferenz geht zu einem Kandidaten, der nicht optionale Parameter, für welche Argumente wurden ausgelassen, die in dem Aufruf. Dies ist eine Folge der Allgemeinen Präferenz in überlast Auflösung für Kandidaten, die weniger Parameter.
http://msdn.microsoft.com/en-us/library/dd264739.aspx
Wie geht es "nicht funktioniert?" Macht es rufen das falsche überlastung? Hat es eine exception werfen?
sorry eingegeben zu früh... also für den ersten Fall, ohne explizit ein argument, alle Optionen werden ignoriert, was in der geringeren Signatur aufgerufen wird... und im zweiten Fall, ruft der überlastung mit FooClass(), es ist nicht möglich... die Antwort ist also, es ist nicht möglich, mit ausgelassenen optionalen Argumente?
wirft eine Ausnahme...Fehler CS1739 die besten überlastung nicht mit einem parameter 'num'
Um es zu erhalten, rufen Sie die überladung mit dem
num
parameter in es, Sie auch zu liefern haben, diename
parameter. Da Sie nicht geben Sie einen optionalen Wert für diename
parameter in der zweiten überlast, es ist nicht ein optionaler parameter.InformationsquelleAutor Robert Harvey
Optionale Parameter definiert werden, die am Ende der parameter-Liste, nachdem alle erforderlichen Parameter. Wenn der Aufrufer liefert ein argument für eine aus einer Folge von optionalen Parametern, es müssen Argumente für alle vorhergehenden optionale Parameter. Komma-getrennt Lücken in der Liste der Argumente werden nicht unterstützt.
Auch,
Einem benannten argument Folgen können positions-Argumenten, wie hier gezeigt.
CalculateBMI(123, Höhe: 64);
Aber eine positionelle argument nicht Folgen, eine benannte argument. Die folgende Anweisung verursacht einen Compilerfehler.
//CalculateBMI(Gewicht: 123, 64);
InformationsquelleAutor user1539399