Escritura implícita y explícita con el nombre C # 6of


Una de las nuevas características más prácticas de C # 6 es nameof, lo que permite al programador eliminar efectivamente el uso de cadenas mágicas.

Según la documentación, nameof devuelve una cadena:

Se usa para obtener el nombre de cadena simple (no calificado) de una variable, tipo o miembro.

Eso funciona bien con la escritura explícita en el siguiente ejemplo de código:

string magicString = nameof(magicString);

Sin embargo, cuando se utiliza la escritura implícita con el var palabra clave :

var magicString = nameof(magicString);

El compilador lanza un error:

No se puede usar la variable local 'magicString' antes de declararla

Luego experimenté un poco más con la ventana interactiva de C# disponible en Visual Studio. De nuevo, el primer ejemplo funcionó bien, pero el segundo ejemplo arrojó un error diferente esta vez:

Error CS7019: No se puede inferir el tipo de 'magicString' ya que su inicializador se refiere directa o indirectamente a la definición.

La expresión nameof devuelve claramente una cadena, así que ¿por qué el compilador no puede escribirla implícitamente cuando se usa con la variable inicializada?

Author: johnnyRose, 2016-03-30

2 answers

El equipo de idiomas sintió que esto no valía la complejidad de las especificaciones.

Puedes ver la discusión aquí.

La razón subyacente de este comportamiento es que la especificación dice (§8.5.1) que los nombres declarados con var no son visibles en la declaración declarante, ya que antes de nameof, no había forma de que eso pudiera ser válido.

Las declaraciones de variables locales implícitamente mecanografiadas están sujetas a las siguientes restricciones:

  • ...
  • La expresión del inicializador no puede referirse a la variable declarada en sí

Sin var, declaraciones como int x = x = 1; o int x = 1, y = x; son legales; con var, nada en esa forma es válido.

 23
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 16:53:56

La capacidad de declarar una variable y asignarla en la misma instrucción es syntactic sugar. Por ejemplo, cuando dices esto:

string magicString = nameof(magicString);

Lo que realmente estás diciendo es esto:

string magicString;
magicString = nameof(magicString);

Dado que magicString ya está declarado, puede usarlo en la siguiente instrucción lógica como parte del operador naemof. Esto se debe a que magicString es ahora parte del ámbito que es visible para las declaraciones posteriores.

Ahora, lo anterior no es cierto cuando se utiliza var porque cualquier cosa que utiliza var para hacer una asignación es realmente todo parte de una sola declaración, no azúcar sintáctica para dos declaraciones como el ejemplo anterior. La variable magicString en realidad no se declara hasta después de su llamada a la función / operador / asignación, por lo que la variable no forma parte del ámbito hasta que haya hecho la asignación, es decir, en la(s) siguiente (s) sentencia (s).

SLaks se refirió a la discusión original sobre este tema, pero lo que en las notas de esta reunión posterior del equipo de diseño de C# sobre este tema sobre la pregunta de "¿Debería var x = nameof(x) funcionar?":

Esto funciona igual que con cualquier otra construcción, es decir: no. Esto es no es un caso especial para nameof, y no parece que valga la pena especial casquillo para permitirlo.

En otras palabras, no es específico de nameof.

 13
Author: rory.ap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 14:55:12