Por que o compilador C # permite uma variável duplicada no escopo aninhado?

18

Historicamente, ao desenvolver no .Net, não conseguia duplicar o nome da variável no escopo aninhado. No entanto, após atualizar recentemente o Visual Studio 2019 para a versão 16.4.2, observei que os nomes de variáveis ​​podem ser duplicados no escopo aninhado.

Por exemplo:

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 que isso é subitamente permitido?

Pergunta de acompanhamento: Se esse for um novo "recurso" de idioma, existe uma maneira de configurar o Visual Studio para continuar interrompido quando uma variável é duplicada no escopo aninhado?

masterjeef
fonte
2
Eu não acho que está permitindo variável duplicada. está usando a mesma testvariável, já que o tipo de dados é o mesmo. tente declarar testvariável como int por exemplo. var test = 12345;Eu acho que você deve obter erro de compilação. (Eu não tentei)
LP13 10/01
11
@ LP13 Alterar o tipo de testcomo sugerido não tem efeito. Você pode experimentá-lo no Fiddle vinculado na pergunta.
Amy
11
Deixa pra lá, a estrutura de destino é irrelevante. O novo comportamento é devido à versão do idioma. O código é compilado no C # 8, não é compilado no C # 7.3 (e abaixo eu assumo)
Emanuel Vintilă
6
Há um problema no GitHub para isso. O marco é definido como 16.5. @OrkhanAlikhanov você achou mais rápido :)
Pavel Anikhouski 10/01

Respostas:

1

Esse é um novo recurso do C # 8.0, os parâmetros de função local e lambda podem sombrear nomes externos.

Sebastian 506563
fonte
0

meu palpite é que a função select está sendo compilada como estática, pois não possui conexões com o corpo do método host. apenas imprime e retorna o item em questão. isso não requer nenhum acesso ao método e, como tal, pode, por motivos de otimização, ser retirado do corpo do método e colocado sozinho no escopo global.

e, nesse caso, essa variável de teste é sua própria variável e não possui conexões com a variável de teste acima.

quanto a evitar isso, você não pode dizer ao vs para lançar um erro quando ocorrer, você apenas terá que alterar manualmente o nome da variável.

Bailey Drahoss
fonte