2010-12-31 11 views
10

pls dime en qué versión se introduce la palabra clave dinámica? Encontré un comportamiento extraño en VS2010. Establecí el marco de destino en 3.5. Pero no hay error de compilación. simplemente haga una aplicación de consola con target framework a .net 3.5 y use una palabra clave dinámica.problema de palabra clave dinámico

Respuesta

10

La palabra clave dinámica se introdujo como parte del lenguaje C# 4.0 - el compilador viene con VS 2010. Es una característica de idioma y no necesita soporte de tiempo de ejecución (AFAIK), por lo tanto una vez cumplido con el compilador C# 4.0, no debería tener ningún problema versión anterior de tiempo de ejecución. Cambiar el marco de destino en VS 2010 no cambia el compilador (que permanece en 4.0) - recibiremos un error de compilación solo si utiliza una función dirigida a una nueva biblioteca o tiempo de ejecución. Por ejemplo, en VS 2008, podría usar expresiones lambda o palabra clave var para target runtime 2.0, pero los métodos de extensión no estaban disponibles porque el atributo de extensión formaba parte del ensamblado 3.5.

EDITAR: Above is wrong - dynamic keyword requires Framework 4.0. Ni siquiera pude compilar en VS2010 cuando el objetivo fx se cambió a 3.5. Creo que es posible que OP no haya utilizado la variable dinámica más adelante en el código para que la optimización del compilador la haya eliminado, haciendo que OP piense que está funcionando.

+5

El tipo dinámico no es una función de solo idioma, es compatible con el DLR, que es .NET 4. –

+0

Por favor, inténtelo por usted mismo ... –

+0

@chibacity, lamentablemente no tengo VS 2010 en el actual máquina. Probablemente tengas razón al decir que la dependencia del DLR es necesaria para que el funcionamiento sea dinámico. De lo contrario, creí que saokat podía usarlo con Fx 3.5. – VinayC

14

El tipo dinámico se introdujo en .Net 4.0.

El tipo dinámico no es una función de solo idioma (es decir, es totalmente compatible con el compilador). Se basa en el DLR que es una característica .Net 4.0 que necesita soporte de biblioteca.

No se puede usar el marco dinámico y de destino .Net 3.5.

+0

pero ¿por qué no hay error de compilador para 3.5 aplicación en vs 2010 – saokat

+0

@saokat Debe estar teniendo un pedo cerebral: no puede usar la dinámica con .Net 3.5. Por favor, compruebe su configuración e intente y vuelva a compilar. –

+0

@chibacity, sé que no puedo usar dynamic en 3.5. pero inténtalo tú mismo. Incluso configuré supportedRuntime en el archivo de configuración. no hay error de tiempo de ejecución – saokat

10

Cuando usa Visual Studio 2010, por defecto es C# 4.0.

No puede usar C# 3.0 con Visual Studio 2010.

Incluso si se dirige a .Net Framework 3.5, solo usará Framework 3.5 y no C# 3.0.

Ahora, desde su valor predeterminado es C# 4.0, se llega a utilizar dynamic. Pero para que eso funcione, debe hacer referencia al Microsoft.CSharp.dll. Ese ensamblaje está compilado con v 4.0. No puede usarlo en v 3.5.

dynamic necesita DLR (Dynamic Language Runtime) que no está disponible para las versiones anteriores.

Es por eso que cuando intenta utilizar dynamic en el proyecto Framework 3.5, se volverá loco.

Por lo tanto, para resumir, para usar dynamic, use Framework 4.0.

+2

No existe tal cosa como "C# 3.5". C# 3.0 se introdujo con .NET 3.5. –

+0

Gracias, corregido. – decyclone

+1

¿Por qué se rechaza este voto? El punto principal es que necesita 'Microsoft.CSharp.dll', que es verdadero. +1 – Mehrdad

1

Sólo por el bien del conocimiento: Esta técnica se llama 'El polimorfismo mediante el enlace en tiempo'

Fue introducido en .NET Framework 1.1. C# adquirió esta característica en la versión 4.0. En Visual Basic, fue posible iniciar esto sin cometer errores de compilación.

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 

`

Todo el truco está en que el tipo de "objeto" desempeñó el papel de los padres de nivel superior, así como actuó como una variable dinámica