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

7
有两个项目,一个是针对.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);
}

我理解从这个问题,简单的名称不应该有不同的含义,因此,即使是.NET Standard 2.0库也应该出现错误,但实际上并没有。为什么会出现这种不一致性?

我尝试了dotnet fiddle,它似乎在.NET Core 3.1和Roslyn 3.4上运行良好,但在.NET Framework 4.7.2上却没有,这更加令人困惑。这里到底发生了什么?


1
你能再确认一下它是否能在netstandard2.0上运行吗?我无法复现 - 我可以让它在netstandard2.1上运行,但那不是同一个版本。 - Jon Skeet
1
是的,你说得对。它在.NET Standard 2.0项目上工作的原因是因为我们有<langversion>latest</langversion> - Ghasan غسان
1个回答

6
基本上,C# 8编译器引入了一个新特性,即允许使用与现有局部变量同名的lambda表达式参数,但是对此并没有太多的关注。我在本周的一次会议中偶然听到了这个消息(来自Mads),否则我就不会知道它。目标框架很重要,因为它更改编译器应用的默认语言版本。不过你可以使用<LangVersion>元素显式地指定它。例如,使用以下项目文件:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>
</Project>

代码可以成功构建。同样适用于针对 netstandard2.0 或 netcoreapp2.2 的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接