5

Oggi stavo scrivendo un piccolo programma per comprendere i fondamenti dei parametri facoltativi di C#.Impossibile comprendere l'output dei metodi con parametro facoltativo

seguito il programma:

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

Ecco come ho chiamato Test() metodo:

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

uscita:

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

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

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

Per quanto riguarda d.Test();: Ecco la mia comprensione è, sarà trattare Test() come metodo con un parametro opzionale, e invocherà Test(int a = 1) con questo output:

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

0.123.

Ma questo è ciò che mi confonde durante l'esecuzione d.Test(6);: Perché questo metodo chiamata non sta dando in uscita come:

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

Come per la mia comprensione "6" è il parametro obbligatorio e dovrebbe richiamare

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

gentilmente spiegare ciò che è sbagliato con la mia comprensione.

Anche come chiamare un metodo sovrascritto?

internal override void Test() 
+3

Perché 'Test (6)' invoca 'Test (int b, int a = 1)'? Esiste già un metodo di corrispondenza 'Test (int a = 1)', che viene invocato con 'a' impostato su' 6'. –

+0

Si prega di vedere ["Le domande dovrebbero includere" tag "nei loro titoli?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è "no, non dovrebbero"! –

+1

@Dennis_E Ma perché 'Test (int a = 1)' ha chiamato nel primo caso quando c'è una corrispondenza molto migliore senza parametri? – HimBromBeere

risposta

0

Le regole intorno parametri opzionali possono essere un po 'di confusione, ma una semplice regola da ricordare è che sarà sempre utilizzare un metodo con meno parametri di preferenza a uno con più.

Così per

d.Test(6); 

il metodo con un solo parametro: sarà utilizzato

internal void Test(int a = 1) 

, anche se è un parametro opzionale.

+1

Potresti fornire alcuni documenti relativi a questo? La pagina MSDN su argomenti nominati e opzionali non mi sembra molto chiara. –

6

La regola di corrispondenza per internal void Test(int a = 1) corrisponde al codice d.Test(6); migliore: corrisponde al numero di argomenti, i tipi. Ciò rende il metodo il migliore abbinamento.

Quando si chiama d.Test(b:7);, si forza l'esecuzione come ultimo metodo, poiché si sta verificando la corrispondenza sul nome del parametro.Ciò rende l'ultimo metodo il miglior abbinamento.

Il primo (d.Test();) non corrisponde al metodo previsto (void Test()), poiché i metodi "propri" sono preferiti rispetto ai metodi derivati. Prova a rimuovere la classe base o usa l'operatore new sul metodo e vedrai.