2011-01-05 14 views
6

La razón por la que pregunto es que solo es válida en la declaración de parámetros del método, ¿no es así? Estaba tratando de hacer una variable dentro del cuerpo de la función llamada "params", pero por supuesto esto no es gran cosa, solo me pregunto por qué MS eligió convertirla en una palabra clave global y no contextual.¿Por qué la palabra clave params no es contextual?

+3

No estoy seguro de la parte del por qué, pero si realmente desea utilizar esto como un nombre de variable en C# preface, el nombre de la variable con @: int @params = 1; – Derrick

Respuesta

5

La respuesta de tvanoffson conjetura que sería difícil hacer "params" contextuales. En realidad, no sería tan difícil. Considere:

void M(params x) 

Lo que haríamos en este caso, hipotéticamente, es el primer intento de encontrar un tipo 'params'. Si pudiéramos encontrar uno, genial, hemos terminado. Si no pudiéramos, entonces tenemos un pequeño problema. Supongamos, por ejemplo, en lugar de x era

void M(params Int32) 

Es evidente que eso es un error, pero qué error? ¿Deberíamos suponer que Int32 es el nombre del parámetro y dar el error "te falta el tipo"? ¿Deberíamos asumir que Int32 es del tipo y dar un error al decir que el tipo tiene que ser del tipo de matriz, y que le falta el identificador? ¿Deberíamos dar un error al decir que no hay ningún tipo llamado 'params'? ¿Qué es lo que hay que hacer aquí? Claramente, podríamos descubrir algo, pero no es obvio.

Son los casos de error que son difíciles con las palabras clave contextuales; lograr que funcionen los casos de éxito es bastante sencillo.

Pero realmente, no es tanto que sea difícil para contextualizar como que hacerlo contextual no es una gran ganancia. Hacer "establecer" y "valorar" el contexto fue una gran victoria porque asumimos que todo tipo de gente querrá hacer variables locales con nombres como "establecer" y "valorar". "params" ni siquiera es una palabra en inglés, por lo que parece menos probable que alguien quiera usarla. No hay un gran beneficio al hacerlo contextual, por lo que el costo de la función no está justificado.

+0

Gracias Eric. Realmente estaba esperando leer lo que tenías en mente. Para mí, parece que los casos válidos serían 1. ¿Hay algún tipo de params disponible? 2. De lo contrario, tiene que haber un tipo en forma de Tipo [], seguido de un identificador. No soy un experto como tú, pero ¿crees que esto cubre todos los casos? También tienes razón, no es una palabra en inglés, solo pensé que sería útil en algún código, en lugar de escribir parámetros/(s). –

2

La palabra clave params parece ser útil en la declaración de parámetros del método, pero de hecho estoy de acuerdo con MS en que no sería una buena idea dejar palabras clave para nombres de instancias, de todos modos.

Tal vez está reservando la posibilidad de tener algo como esto en C# 8.0:

params Customers = DB.GetCustomerList(); 

o de otra manera permiten params en un ámbito local.

+0

¿Pero qué haría eso? Para mí usarlo en el ámbito local que mostraste no tendría mucho sentido, ¿o sí? No estoy seguro. Por cierto, ¿cuándo está saliendo C# 8.0? : O –

+1

Creo que en 2017 si mi bola de cristal es precisa. –

+1

Joan - Buena pregunta. No tengo idea de lo que eso haría. De hecho, ni siquiera creo que esa línea de código compilará en C# 8.0 debido a un error de sintaxis. – Flipster

9

Lo mismo podría preguntarse acerca de cualquier otra palabra clave. Por ejemplo, ¿por qué no es "clase" contextual ya que solo se usa en declaraciones de clase?

Para mí, una palabra clave es una palabra clave. Me imagino que simplifica enormemente la parte del análisis léxico de la compilación para que no tenga que ser tan consciente del contexto.

Como acotación al margen, puede utilizar el símbolo @ para que pueda declarar una variable llamada 'params' (o cualquier otra palabra clave reservada):

var @params = new int[] { 1, 2 }; 
+0

Gracias, pero si la clase fuera contextual, ¿cómo separarían el uso de clases anidadas? Pero con los params, simplemente no hay otro lugar para usarlo, y parece ser que sería fácil distinguirlos, pero yo no soy un maestro compilador como Eric Lippert. –

+0

Creo que podrías tratar de hacer 'clase' contextual buscando la sintaxis típica de declaración de clase: [modificador de accesibilidad] clase [nombre de clase] {}. Pero no estoy al tanto de las especificaciones del compilador como para saber si esto es realmente factible. –

+0

Ok, eso tiene sentido. –

4

Eric Lippert tiene una entrada de blog que cubre contextual and reserved keywords y su historia. Aunque no explica explícitamente por qué params está en la lista reservada (lo ha sido desde 1.0), implica que pertenece al conjunto de palabras reservadas que sería hard para hacer contextual.

+0

Gracias, ¿para eso son las palabras reservadas? Pensé que significaba que estaba reservado para nuevos usos potenciales en el futuro. –

+2

@Joan: algunos pueden ser, pero la mayoría están * reservados * como en "reservados solo para este propósito". – tvanfosson

Cuestiones relacionadas