2010-01-23 11 views
6

Tengo un analizador C# 4.0. Acepta 'dinámico' como palabra clave como tipo. Mis viajes analizador más declaraciones que se encuentran en el trabajo de C# 3.0 programas de la forma de:C# palabra clave 'dinámica' ... ¿es realmente una palabra clave RESERVADA o solo un identificador que significa algo especial cuando se usa como tipo?

dynamic = <exp> ; 

lo tanto, es realmente una palabra clave dinámica? ¿O todavía se puede usar como un nombre de identificador arbitrario? (De ser así, ¿por qué no se trata 'int' de la misma manera)?

¿Existe alguna especificación de referencia que indique si la palabra clave dynamic es? La última especificación de ECMA C# 4 ni siquiera menciona "dinámica", y lo mejor que puedo encontrar en el sitio de MS es una "especificación preliminar" que dice que es una palabra clave pero sospecho que es solo una escritura descuidada.

+0

Esto podría ayudar. http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx –

+0

@Eric: buen fondo. Me había perdido el hecho de que var era una palabra clave contextual, vaya, tengo un analizador para ir a ajustar. –

Respuesta

10

dynamic es una palabra clave contextual a partir de C# 4.0. La cuarta edición de la especificación ECMA C# no se refiere a C# 4.0. (Observe la fecha de publicación de 2006).

MSDN lo describe como una palabra clave.

También está en este table of contextual keywords. (Desplácese hacia abajo.)

+0

Quizás. Pero en el mismo documento de MSDN hay una sección en keywords en la que 'dinámico' brilla por su ausencia. –

+0

Tu enlace está roto. Pero en la página a la que se refiere, está en la segunda tabla de palabras clave contextuales. –

+0

Aha ... ¡eso es lo que extrañé! ¡Muchas gracias! –

1

Es una palabra clave. (ver la edición más abajo) Estoy un poco confundido con lo que quiere decir con "¿por qué no se trata a 'int' de la misma manera?"

No se puede hacer esto: int int = 5;

Pero se puede hacer esto, aunque no es una buena práctica: int @int = 5;

El C# 4.0 spec no mencionar dynamic en la sección 20.1.

EDIT: más información ...

Usando dinámico como un nombre de variable está permitido, así que no es una palabra clave (pero es una palabra clave contextual - ver Sean Devlin's post). Ver la siguiente captura de pantalla utilizando .NET 4.0 beta

dynamic

Salida Chris Burrow blog post. Una cita interesante del poste:

Como se puede ver, las visibles públicamente miembros que usan el tipo dinámico realidad, detrás de las escenas, utilizar el objeto tipo cuando se emiten. No hay un tipo de marco "dinámico". Sin embargo, esos "objetos" son todos decorados de tal manera que el compilador (o cualquier otra persona) puede indicar que están destinados a ser manejados dinámicamente.

+0

¿Cómo lo sabes exactamente? ... ¿Afirma que el programa C# 3.0 que contiene las asignaciones a 'dinámico' no es válido en C# 4.0 (que rompe la compatibilidad hacia atrás, que generalmente es un no-no)? Si la asignación * es * válida en C3.0, entonces ¿por qué no int = 7; ¿ser permitido? –

+0

Creo que cada versión principal del lenguaje tiene palabras clave añadidas y compatibilidad retroactiva rota. P.ej. 'foreach' en C# 2.0 y' var' en C# 3.0. –

+0

... Sí, he visto esa especificación C# 4.0; ese es el que no confío en cuanto a su caracterización de la "palabra clave" real. La especificación C# 3.0 tiene una sección de explicición sobre palabras clave; la especificación C# 4.0 no es así, por lo que es difícil saber si este detalle se trata con precisión. (Estoy seguro de que el compilador de C# 4.0 tiene una opinión, pero también lo harán los codificadores enojados de C3.0 que usaron el nombre dinámico como identificador). –

7

No es una palabra clave "normal" como if, etc. for

Es un contextual palabra clave como yield, from etc.

En particular, esta compila:

object dynamic = 0; // dynamic is a contextual keyword 

pero esto no es así:

object string = 0; // string is a regular keyword 

Habría que "escapar" string así:

object @string = 0; 

Este tiene mucho sentido en términos de compatibilidad con versiones anteriores: es poco probable que muchas personas hayan creado un tipo llamado dynamic (que causaría ambigüedad; IIRC el tipo "real" gana en este caso) mientras que es muy es probable que el código existente use variables llamadas dynamic.

De alguna manera ni siquiera tiene que ser una palabra clave contextual (y no creo que la especificación se refiera explícitamente a ella como tal) - puede pensar que es el nombre de un tipo que siempre está disponible (como string y object). Me imagino que string etc. se hicieron palabras clave de v1 para evitar confusiones, pero agregar palabras clave genuinas (que no se pueden usar como identificadores) tendría un alto costo de compatibilidad ahora.

+0

Genial (de hecho, te creo porque eso evitaría algunos problemas de compatibilidad con versiones anteriores). Pero ... ¿dónde está la fuente autoritativa que está utilizando para obtener este hecho específico? –

+0

@Ira: estoy buscando una copia de la especificación C# 4 que * no * liste 'dynamic' entre palabras clave; no hay una lista de palabras clave contextuales. Estoy editando para obtener un poco más de información ... –

+0

Gran explicación Jon!Pero creo que usar la palabra "Reservado" en lugar de "Normal" hubiera sido más apropiado ya que hay dos tipos de palabras clave definidas en C#, a saber, reservadas y contextuales. – RBT

Cuestiones relacionadas