2011-10-12 16 views
5

Mi capita di vedere un codice simile a questo.casting dinamico nel parametro C#

function((dynamic) param1, param2); 

Quando e perché è necessario questo tipo di trasmissione di tipo dinamico per i parametri?

+0

Mi piacerebbe vedere di più. In genere, se la funzione accetta una variabile dinamica, * potresti * eseguire il cast, ma non è necessario. – scottm

+0

@scottm: Questo è quello che stavo pensando inizialmente, poi mi sono ricordato che puoi anche usarlo per scegliere il sovraccarico corretto di un metodo in fase di esecuzione. –

+0

@JamesMichaelHare Caso di uso molto piccolo. Questo è il tipo di cosa che rimprovererò uno sviluppatore precedente per l'uso intenzionale. – scottm

risposta

5

Può essere usato per scegliere dinamicamente un sovraccarico di function(...) in base al tipo di param1 in fase di esecuzione, ad esempio:

public static void Something(string x) 
{ 
    Console.WriteLine("Hello"); 
} 

public static void Something(int x) 
{ 
    Console.WriteLine("Goodbye"); 
} 
public static void Main() 
{ 
    object x = "A String"; 

    // This will choose string overload of Something() and output "Hello" 
    Something((dynamic)x); 

    x = 13; 

    // This will choose int overload of Something() and output "Goodbye" 
    Something((dynamic)x); 
} 

Così, anche se x è un riferimento ad object, si deciderà a runtime cosa sovraccarico di Something() da chiamare. Si noti che se non vi è un sovraccarico appropriato, verrà generata un'eccezione:

// ... 
    x = 3.14; 

    // No overload of Something(double) exists, so this throws at runtime. 
    Something((dynamic)x);