¿Por qué el compilador de C # permite una variable duplicada en un ámbito anidado?

18

Históricamente, al desarrollar en .Net, no podía duplicar el nombre de la variable en el ámbito anidado. Sin embargo, después de actualizar recientemente Visual Studio 2019 a la versión 16.4.2, he notado que los nombres de variables pueden duplicarse en un ámbito anidado.

Por ejemplo:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

¿Por qué se permite esto de repente?

Pregunta de seguimiento: si se trata de una nueva "característica" del lenguaje, ¿hay alguna forma de configurar Visual Studio para que continúe interrumpiéndose cuando una variable se duplica en un ámbito anidado?

masterjeef
fuente
2
No creo que permita variables duplicadas. está usando la misma testvariable ya que el tipo de datos es el mismo. intente declarar testvariable como int p. ej. var test = 12345;Creo que deberías obtener un error de compilación. (No lo he probado)
LP13
1
@ LP13 Cambiar el tipo de testcomo se sugiere no tiene ningún efecto. Puede probarlo en el violín vinculado en la pregunta.
Amy
1
No importa, el marco objetivo es irrelevante. El nuevo comportamiento se debe a la versión del idioma. El código se compila en C # 8, no se compila en C # 7.3 (y supongo que a continuación)
Emanuel Vintilă
66
Hay un problema de GitHub para eso. Milestone se establece en 16.5. @OrkhanAlikhanov lo has encontrado más rápido :)
Pavel Anikhouski

Respuestas:

1

Esta es una nueva característica en C # 8.0, la función local y los parámetros lambda pueden sombrear los nombres externos.

Sebastian 506563
fuente
0

Supongo que la función de selección se está compilando como estática, ya que no tiene conexiones con el cuerpo del método host. solo imprime y devuelve el artículo en cuestión. esto no requiere ningún acceso al método y, como tal, puede, por razones de optimización, salir del cuerpo del método y colocarse por sí solo dentro del alcance global.

y en este caso, esa variable de prueba es su propia variable y no tiene conexiones con la variable de prueba anterior.

en cuanto a evitar esto, no puede decirle a vs que arroje un error cuando ocurra, solo tendrá que cambiar manualmente el nombre de la variable.

Bailey Drahoss
fuente