为什么 C# 编译器允许在嵌套作用域中存在重复变量?

mas*_*eef 18 c# .net-core visual-studio-2019

从历史上看,在 .Net 中开发时,我无法在嵌套范围内重复变量的名称。但是,最近将 Visual Studio 2019 更新到版本 16.4.2 后,我注意到变量名称可以在嵌套作用域中重复。

例如:

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
Run Code Online (Sandbox Code Playgroud)

https://dotnetfiddle.net/h85BK4

为什么突然允许这样做?

后续问题:如果这是一个新的语言“功能”,是否有办法将 Visual Studio 配置为在嵌套范围内重复变量时继续中断?

小智 0

我的猜测是 select 函数被编译为静态,因为它与主机方法体没有连接。它只是打印并返回有问题的项目。这不需要对该方法进行任何访问,因此,出于优化原因,可以将其移出方法主体并在全局范围内单独放置。

在这种情况下,该测试变量是它自己的变量,与上述测试变量没有任何连接。

至于防止这种情况,你不能告诉 vs 在发生错误时抛出错误,你只需手动更改变量名称即可。