2012-02-24 11 views
6

Questa non è una domanda sulla corretta pratica di programmazione, sto solo lavorando sulla semantica. Diciamo che ho le seguenti costruttori ...C#: sovraccaricando i costruttori con parametri opzionali e argomenti con nome?

public FooClass(string name = "theFoo") 
{ fooName = name; } 

public FooClass(string name, int num = 7, bool boo = true) : this(name) 
{ fooNum = num; fooBool = boo; } 

è possibile utilizzare argomenti con nome ... questa convenzione?

FooClass foo1 = new FooClass(num:1); 

// dove sto solo passando un argomento di nome, basandosi sulle optional per prendersi cura di tutto il resto

o chiamare il costruttore FooClass (string, int, bool) senza argomenti? come in ...

FooClass foo2 = new FooClass(); 
+7

Che ne dici di provarlo? Hai il codice giusto lì ... dimmi se funziona! –

+0

ok, avrei dovuto specificare che il codice di esempio non funziona e volevo sapere come farlo funzionare. – user1229895

risposta

5

L'utilizzo di argomenti con nome e opzionali colpisce la risoluzione di sovraccarico nei seguenti modi:

  • Metodo, indicizzatore, o il costruttore è un candidato per l'esecuzione, se ciascuno dei suoi parametri o è opzionale o corrisponde, per nome o per posizione, a un singolo argomento nell'istruzione chiamante e tale argomento può essere convertito nel tipo del parametro.

  • Se viene trovato più di un candidato, le regole di risoluzione di sovraccarico per le conversioni preferite vengono applicate agli argomenti specificati in modo esplicito. Gli argomenti omessi per i parametri facoltativi vengono ignorati.

  • Se due candidati sono giudicati ugualmente buoni, la preferenza va a un candidato che non ha parametri opzionali per i quali gli argomenti sono stati omessi nella chiamata. Questa è una conseguenza di una preferenza generale nella risoluzione del sovraccarico per i candidati che hanno meno parametri.

http://msdn.microsoft.com/en-us/library/dd264739.aspx

+0

Capisco che confronta le firme, ma potresti riformulare il mio codice di esempio per farlo funzionare? – user1229895

+0

In che modo "non funziona?" Chiama il sovraccarico sbagliato? Fa un'eccezione? –

+0

dispiace entrato troppo presto ... così per il primo caso, senza indicare in modo esplicito un argomento tutti optional vengono ignorate, con la conseguente firma minore di essere chiamato ... e nel secondo caso di chiamare il sovraccarico FooClass(), non è possibile... quindi la risposta è che non è possibile usare named con argomenti facoltativi omessi? – user1229895

0

parametri opzionali sono definiti alla fine dell'elenco dei parametri, dopo tutti i parametri richiesti. Se il chiamante fornisce un argomento per uno qualsiasi di una serie di parametri facoltativi, deve fornire argomenti per tutti i precedenti parametri facoltativi. Gli spazi vuoti separati da virgole nella lista degli argomenti non sono supportati.

Inoltre,

Un argomento di nome in grado di seguire argomenti posizionali, come mostrato qui. CalculateBMI (123, altezza: 64); Tuttavia, un argomento posizionale non può seguire un argomento con nome. La seguente dichiarazione causa un errore del compilatore. // CalculateBMI (peso: 123, 64);

Problemi correlati