2013-06-17 23 views
9

Quali sono le regole per la risoluzione del numero variabile di parametri passati da params?Risoluzione dei parametri in C#

Supponiamo, che ho il codice:

public void Method(params object[] objects) { } 

public void Method(IMyInterface intf, params object[] objects) { } 

Come viene Method(a, b, c) risolto, se a è un IMyInterface? Posso essere sicuro che C# cercherà sempre di selezionare il sovraccarico più adatto?

+0

cura di commentare la downvote? – Spook

risposta

11

Questa venga risolta dalle specifiche C# lingua:

7.5.3.1 membro funzione applicabile

[...]

  • In caso contrario, se MP è applicabile in la sua forma normale e MQ ha un array di parametri ed è applicabile solo nella sua forma espansa, quindi MP è migliore di MQ.

  • Altrimenti, se MP ha più parametri dichiarati di MQ, MP è migliore di MQ. Ciò si può verificare se entrambi i metodi hanno gli array e sono applicabili solo nei moduli espansi.

[...]

Nel tuo esempio entrambi i sovraccarichi sarebbero applicabili solo nelle loro forme espanse. Dal momento che il secondo ha più parametri dichiarati, sarebbe meglio.

Nel contesto della specifica, un sovraccarico essendo meglio di tutti gli altri significa che il compilatore lo seleziona di impegnare la chiamata, come accadrebbe nell'esempio in esame (se nessuno sovraccarico è meglio di tutto il altri, il risultato è un errore in fase di compilazione a causa dell'ambiguità).

+0

Che cos'è la forma espansa dei parametri del metodo? –

+0

@gmailuser: In parole povere, si sta utilizzando il "modulo espanso" se la rimozione di 'params' dalla definizione del metodo causerebbe la mancata compilazione della chiamata del metodo. Prendendo il primo sovraccarico, 'Metodo (nuovo oggetto [] {" pippo "})' è la forma normale perché l'argomento formale è un 'oggetto []' e questo è ciò che stai passando. 'Method (" pippo ")' è la forma espansa perché ci si basa sul compilatore per creare l'oggetto '[]' per te, e non sarebbe possibile senza 'params'. – Jon

3

Vedi anche C# Spec. 17.5.1.4 regarding Parameter arrays

Quando si esegue la risoluzione di sovraccarico, un metodo con un parametro di matrice può essere applicabile sia nella sua forma normale o nella sua forma espansa (§14.4.2.1). 2 La forma espansa di un metodo è disponibile solo se la forma normale del metodo non è applicabile e solo se un metodo con la stessa firma del modulo espanso non è già dichiarato nello stesso tipo .

Esempio

using System; 
class Test 
{ 
    static void F(params object[] a) { 
     Console.WriteLine("F(object[])"); 
    } 
    static void F() { 
     Console.WriteLine("F()"); 
    } 
    static void F(object a0, object a1) { 
     Console.WriteLine("F(object,object)"); 
    } 
    static void Main() { 
     F(); 
     F(1); 
     F(1, 2); 
     F(1, 2, 3); 
     F(1, 2, 3, 4); 
    } 
} 

produce l'uscita:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
Problemi correlati