【发布时间】:2020-01-29 17:58:41
【问题描述】:
我最近编写了一些代码,无意中重用了一个变量名作为在已经具有同名变量的函数中声明的操作的参数。例如:
var x = 1;
Action<int> myAction = (x) => { Console.WriteLine(x); };
当我发现重复时,我惊讶地发现代码编译和运行完美,根据我对 C# 范围的了解,这不是我所期望的行为。一些快速的谷歌搜索出现了抱怨类似代码确实产生错误的 SO 问题,例如Lambda Scope Clarification。 (我将该示例代码粘贴到我的 IDE 中以查看它是否会运行,以确保它运行完美。)此外,当我进入 Visual Studio 中的重命名对话框时,第一个 x 突出显示为名称冲突。
为什么这段代码有效?我在 Visual Studio 2019 中使用 C# 8。
【问题讨论】:
-
lambda 被移动到由编译器生成的类的方法中,因此该方法的整个
x参数被移出范围。有关示例,请参见 sharplab。 -
这里可能值得注意的是,当以 C# 7.3 为目标时,它不会编译,因此这似乎是 C#8 独有的。
-
链接问题中的代码在sharplab 中也可以正常编译。这可能是最近的变化。
-
发现了一个骗子(没有答案):stackoverflow.com/questions/58639477/…
标签: c# lambda scope c#-8.0 variable-names