【问题标题】:Why does the C# compiler allow a duplicated variable in nested scope?为什么 C# 编译器允许嵌套范围内的重复变量?
【发布时间】:2020-02-19 21:40:23
【问题描述】:

从历史上看,在 .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 配置为在嵌套范围内重复变量时继续中断?

【问题讨论】:

  • 我不认为它允许重复变量。它使用相同的test 变量,因为数据类型相同。尝试将test 变量声明为int 例如。 var test = 12345; 我认为你应该得到编译错误。 (我没试过)
  • @LP13 按照建议更改test 的类型无效。您可以在问题中链接的 Fiddle 中尝试。
  • 没关系,目标框架无关紧要。新行为是由于语言版本。该代码在 C# 8 上编译,它不能在 C# 7.3 上编译(我假设以下)
  • 有 GitHub issue 。里程碑设置为 16.5。 @OrkhanAlikhanov 你发现它更快:)

标签: c# .net-core visual-studio-2019


【解决方案1】:

这是 C# 8.0 中的一项新功能,本地函数和 lambda 参数可以隐藏外部名称。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 2017-11-16
      • 2020-08-04
      • 2011-07-10
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多