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


18

历史上,在.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

https://dotnetfiddle.net/h85BK4

为什么突然允许这样做?

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


2
我不认为它允许重复变量。test由于数据类型相同,因此使用相同的变量。尝试将test变量声明为int 例如。var test = 12345;我认为你应该得到编译错误。(我还没有尝试过)
LP13

1
@ LP13 test按建议更改类型无效。您可以在问题中链接的小提琴中尝试。
艾米

1
没关系,目标框架是无关紧要的。新的行为归因于语言版本。该代码在C#8上编译,而在C#7.3(以及我认为以下的版本)上没有编译
EmanuelVintilă


6
有GitHub 问题。里程碑设置为16.5。@OrkhanAlikhanov,您发现它的速度更快:)
Pavel Anikhouski

Answers:



0

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

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

为了防止这种情况的发生,您无法告诉vs发生错误时,您只需手动更改变量名即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.