为什么在 c# 8 中允许局部阴影?

Oli*_*ver 6 c#-8.0

我有一堆项目的解决方案,所有项目都在 .Net Standard 2.0 或 .Net Core 2.2 上运行。同样由于历史原因,所有项目文件中的语言版本都被定义为<LangVersion>latest<LangVersion>. 由于最近的 Visual Studio 更新之一(目前我在 16.3.7),.Net Core 3.0 和 C# 8 也可用。到现在为止还挺好。

然后随着时间的推移,我实现了一些基于 EF 核心的功能(但在这种情况下无关紧要)并编写了以下代码(或多或少):

var entity = _context.SomeEntities
    .Where(entity => entity.Id == id)
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

它编译没有任何问题!错误信息在哪里A local or parameter named 'item' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

即使下面的代码编译也没有任何错误:

var items = Enumerable.Range(1, 10);
var item = 2;
Console.WriteLine(item);
item = items.FirstOrDefault(item => item % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

我猜编译器会选择最接近的变量并执行程序员希望的操作。不幸的是,我没有找到任何关于这是 C# 8 的新特性之一并且现在被允许的信息。但是我发现其他一些(和较旧的)帖子像这个讨论一样,在这些情况下最好让编译器失败,因为从长远来看它会带来更多麻烦,现在这个功能已经消失了。

那么有没有人有关于这个特定新行为的一些链接或文档,如果这真的是有意的,思想改变的原因是什么?