2011-02-10 16 views
20

Se ho:C# - sono parametri dinamici Boxed

void Foo(dynamic X) { 
} 

E poi:

Foo(12); 

Would 12 ottenere inscatolato? Non riesco a immaginarlo, vorrei solo chiedere agli esperti.

+2

Perché immagini che non sarebbe? Come immagina che il runtime stia memorizzando un valore * di tipo * in fase di compilazione sconosciuto se non come un oggetto? (Questa non è una domanda retorica, mi interessa sapere perché le intuizioni delle persone li portano a credere a cose false sulle caratteristiche del linguaggio in modo che possiamo provare a progettare funzioni migliori in futuro.) –

+0

Sei nella squadra C# ?? Non era un'ipotesi giustificata da parte mia. Con tutte le straordinarie funzionalità che sono state aggiunte a C#, è facile a volte dimenticare che C# è ancora un linguaggio tipizzato staticamente, quindi come potrebbe * not * essere oggetto sotto le copertine. Se sei nel team C#, quindi grazie per le espressioni lambda. La migliore caratteristica del linguaggio di sempre. –

+2

@Adam: prego. Mi è piaciuto molto implementare espressioni lambda e sono contento che ti stia divertendo ad usarli! –

risposta

14

Sì, lo sarà.

Sotto il cofano, un tipo dynamic è solo un object con alcuni meta-dati, così valore tipi otterrà inscatolato quando messo in una variabile, un campo o parametro di tipo dynamic.

Il metodo sarà effettivamente essere compilato come questo:

void Foo([Dynamic] object X) 
{ 
} 

Leggi di più riguardo il DynamicAttribute here.

IL codice definendolo:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    .maxstack 8 
    L_0000: nop 
    L_0001: ldc.i4.s 12 
    L_0003: box int32 
    L_0008: call void ConsoleApplication13.Program::Foo(object) 
    L_000d: nop 
    L_000e: ret 
} 
+0

Ho avuto una sensazione di affondamento che sarebbe stata la risposta. Grazie. –

1

Sì. Un tipo di valore deve essere inserito in una casella per poter digitare il controllo.

0

Sì!

Dato che è un tipo di valore, sarà inserito in una scatola.

Problemi correlati