2011-10-19 9 views
23

Se ho un parametro dinamico, il compilatore sembra abbandonare il tipo restituito e pensare che sia dinamico.Il parametro dinamico induce il compilatore a pensare che il metodo restituisca dinamico

Ad esempio:

public MethodResult IsValid(object userLogin) 
{  
    return new MethodResult(); 
} 

Si potrebbe pensare che:

var isValidResult = IsValid(someObject()); 

va letta come

dynamic -> MethodResult 

Ma pensa che sia:

dynamic -> dynamic 

L'aggiunta di un parametro dinamico alla firma impedisce al compilatore di sapere quale dovrebbe essere il rendimento nonostante il ritorno sia fortemente digitato?

risposta

19

Sì, l'arresta dinamicamente impedisce al compilatore di conoscere il tipo su qualsiasi parametro, proprietà o metodo restituito. Aggiungi un cast esplicito come:

(MethodResult)IsValid(someObject)); 

La ragione è che una volta che si entra nel mondo dinamico in C# si sta andando in associazione tardiva. Il compilatore non può verificare questo codice perché non può più utilizzare alcuna analisi di tipo statico. Quindi rimanda fino a più tardi. Puoi aiutare a superare questo problema fornendo cast statici come guida per il compilatore.

+1

Per ulteriori dettagli, selezionare [MSDN: utilizzo dei tipi dinamici] (http://msdn.microsoft.com/en-us/library/dd264736.aspx) - "La risoluzione del sovraccarico si verifica in fase di esecuzione anziché in fase di compilazione se uno o più degli argomenti in una chiamata al metodo hanno il tipo dinamico, o se il destinatario della chiamata al metodo è di tipo dinamico. " - Quindi come risultato non è noto fino al runtime quale metodo verrà chiamato affatto. –

Problemi correlati