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.
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
Per espressione circostante, intendi la firma dei metodi? –
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- –