Lambda 参数名称(有时)与本地名称冲突

Gha*_*san 5 c# compiler-errors

有两个项目,一个是面向 .NET Standard 2.0 的库,另一个是面向 .NET Core 2.2 的控制台应用程序。

现在这段代码适用于 .NET Standard 2.0 库,但不适用于 .NET Core 2.2。

for (int i = 0; i < 1; i++) {
    var y = new int[1].First(i => i == 0); // Conflict i name error here in .NET Core 2.2.
    Console.WriteLine("Hello " + y);
}
Run Code Online (Sandbox Code Playgroud)

从这个问题中了解到,简单的名称不应具有不同的含义,因此,即使 .NET Standard 2.0 库也应该给出错误,但事实并非如此。为什么会出现这种不一致?

我尝试过 dotnet fiddle,它似乎适用于 .NET Core 3.1 和 Roslyn 3.4,但不适用于 .NET Framework 4.7.2,这更令人困惑。这里发生了什么?

Jon*_*eet 5

这里发生了什么?

基本上,使用与现有局部变量同名的 lambda 表达式参数的能力是 C# 8 编译器中引入的一项新功能 - 但很少有人对此大惊小怪。我碰巧在本周的一次会议上(从 Mads 本人那里)听说了这件事,否则我不会知道这件事。

目标框架很重要,因为它更改了编译器应用的默认语言版本。不过,您可以使用<LangVersion>元素显式指定它。例如,使用此项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

...代码构建良好。以 netstandard2.0 或 netcoreapp2.2 为目标时同上。