2015-07-07 8 views
10

In un'espressione dinamica dynamic x, c'è un motivo/spiegazione perché l'espressione circostante (ad esempio foo(x)) diventa dinamica?Perché il tipo circostante di un'espressione dinamica non viene risolto staticamente in C#?

considerare:

static string foo(object x) { } 

static void Main() 
{ 
    dynamic x = null; 
    foo(x); // foo(x) is a dynamic expression 
} 

mi è stato presupposto che il compilatore potrebbe risolvere (in fase di compilazione), che foo(object) deve essere chiamato. Tuttavia, passare con il mouse su foo(x) rivela che il tipo è dinamico.

posso aiutare il compilatore con l'Ricavare specificando:

foo((object)x); 

ma ho pensato che il tipo di un'espressione dynamic è object.

Il C# Reference fa dire che "le operazioni che contengono espressioni di tipo dinamico non vengono risolti", la mia domanda è:

ci sono ragioni che impediscono al compilatore di risolvere il tipo di "esterno"/circostante espressione?

Riferimento

Tipo si comporta dinamici come tipo di oggetto nella maggior parte dei casi. Tuttavia, le operazioni che contengono espressioni di tipo dinamico non vengono risolte o controllate dal compilatore. Il compilatore raggruppa le informazioni sull'operazione e tali informazioni vengono successivamente utilizzate per valutare l'operazione in fase di esecuzione. Come parte del processo, le variabili di tipo dynamic sono compilate in variabili di tipo object. Pertanto, digita dynamic esiste solo in fase di compilazione, non in fase di esecuzione.

https://msdn.microsoft.com/en-us/library/dd264741.aspx

+0

Eric Lippert (uno dei principali ragazzi dietro il compilatore C# se non si sa) ha avuto un post blog brillante (-serie) su questo argomento - http: // blogs .msdn.com/b/ericlippert/archive/2012/11/05/dynamic-contagion-part-one.aspx – Luaan

+0

Per espressione circostante, intendi la firma dei metodi? –

+1

In realtà un precedente post sul blog rispondeva alla mia domanda: http: //blogs.msdn.com/b/ericlippert/archive/2012/10/22/a one.aspx-metodo-gruppo-di- –

risposta

3

Supponete di avere

static string foo(object x) { return "bar"; } 
static string foo(string x) { return "foo"; } 

static void Main() 
{ 
    dynamic x = null; 
    foo(x); // foo(x) is a dynamic expression 
} 

In questo caso il compilatore non sarebbe in grado di risolvere il tipo dell'espressione. Mentre penso che nel tuo esempio il tipo dovrebbe essere risolvibile, non sarà nei casi in cui è più utile, rendendo la funzionalità piuttosto inefficace da implementare.

Inoltre, il DLR non può eseguire alcun binding su un riferimento null come nell'esempio.

2

La ragione di questo è che i tipi dinamici non funzionano con il compilatore ma sono risolti in DLR. Non c'è modo per un compilatore di sapere in che tipo verrà risolta la tua dinamica ... Ecco perché tutto ciò che funziona con la dinamica viene risolto solo in fase di esecuzione.

Maggiori informazioni su DLR: https://msdn.microsoft.com/en-us/library/dd233052.aspx

Problemi correlati