2010-12-31 27 views
10

pls dimmi in quale versione della parola chiave dinamica viene introdotta? Ho trovato un comportamento strano in VS2010. Ho impostato il framework di destinazione su 3.5. Ma non c'è nessun errore del compilatore. è sufficiente creare una console con un framework di destinazione su .net 3.5 e utilizzare la parola chiave dinamica.problema di parole chiave dinamiche

risposta

10

La parola chiave dinamica è stata introdotta come parte del linguaggio C# 4.0 - il compilatore viene fornito con VS 2010. È una funzionalità linguistica e non ha bisogno del supporto di runtime (AFAIK) quindi, una volta rispettato il compilatore C# 4.0, non dovrebbe avere alcun problema con versione precedente di runtime. Cambiare il framework di destinazione in VS 2010 non commuta il compilatore (che rimane a 4.0) - riceveremo l'errore del compilatore solo se si utilizza una funzionalità che si rivolge a una nuova libreria o runtime. Ad esempio, in VS 2008, è possibile utilizzare espressioni lambda o parola chiave var per il runtime di destinazione 2.0 ma i metodi di estensione non erano disponibili perché l'attributo di estensione faceva parte dell'assembly 3.5.

MODIFICA: sopra è sbagliato - la parola chiave dinamica richiede Framework 4.0. Non riesco nemmeno a compilare in VS2010 quando target fx è stato modificato in 3.5. Credo che OP potrebbe non aver usato la variabile dinamica più avanti nel codice in modo che l'ottimizzazione del compilatore lo avrebbe rimosso facendolo credere che funzionasse.

+5

Il tipo dinamico non è una funzione solo lingua, è supportato dal DLR che è .Net 4. –

+0

Si prega di provare questo per te ... –

+0

@chibacity, avrei ma purtroppo non ho VS 2010 in corrente macchina. Probabilmente hai ragione nel dire che la dipendenza da DLR è necessaria per il funzionamento dinamico - ho creduto diversamente siccome saokat è in grado di usarlo con Fx 3.5. – VinayC

14

Il tipo dinamico è stato introdotto in .Net 4.0.

Il tipo dinamico non è una funzione solo lingua (vale a dire puramente supportato dal compilatore). Si basa sul DLR, che è una funzionalità .Net 4.0 che ha bisogno del supporto della libreria.

Non è possibile utilizzare la rete dinamica e il target .Net 3.5.

+0

ma il motivo per cui non v'è alcun errore del compilatore per 3.5 application in 2010 – saokat

+0

@saokat Devi avere una scoreggia del cervello - non puoi usare dynamic con .Net 3.5. Si prega di verificare le impostazioni e provare e compilare di nuovo. –

+0

@chibacity, so che non posso usare dynamic in 3.5. ma provalo tu stesso Anche io ho impostato supportedRuntime nel file di configurazione. non c'è nessun errore di runtime. – saokat

10

Quando si utilizza Visual Studio 2010, il valore predefinito è C# 4.0.

Non è possibile utilizzare C# 3.0 con Visual Studio 2010.

Anche se si targetizza .Net Framework 3.5, verrà utilizzato solo Framework 3.5 e non C# 3.0.

Ora, dal momento che il valore predefinito è C# 4.0, è possibile utilizzare dynamic. Ma per farlo funzionare, devi fare riferimento allo Microsoft.CSharp.dll. Tale assembly è compilato con v 4.0. Non è possibile utilizzarlo sotto v 3.5.

dynamic ha bisogno di DLR (Dynamic Language Runtime) che non è disponibile per le precedenti versioni del framework.

Ecco perché quando si tenta di utilizzare dynamic sotto il progetto Framework 3.5, sarà fuori di testa.

Quindi, per riassumere, per utilizzare dynamic, utilizzare Framework 4.0.

+2

Non esiste una cosa come "C# 3.5". C# 3.0 è stato introdotto con .NET 3.5. –

+0

Grazie, corretto. – decyclone

+1

Perché questo è down-votato? Il punto principale è che è necessario 'Microsoft.CSharp.dll', che è vero. +1 – Mehrdad

1

Solo per il gusto della conoscenza: Questa tecnica è chiamata 'Il polimorfismo attraverso l'associazione tardiva'

E 'stato introdotto in .NET Framework 1.1. C# ha acquisito questa funzionalità nella versione 4.0. In Visual Basic era possibile iniziare questo con errori di compilazione.

Public Class Foo 
    Public Sub Bar() 
    End Sub 
End Class 

Public Class Test 
    Public Sub Test() 
     Dim o as Object 
     o = New Foo() 
     ' This will compile and work 
     o.Bar() 
     ' This will also compile but will throw an exception 
     o.NonExistingMember() 
    End Sub 
End Class 

`

Tutto il trucco è in quanto il tipo di "oggetto" svolto il ruolo del genitore di livello superiore così come ha agito come una dinamica variabile

Problemi correlati