我有一堆项目的解决方案,所有项目都在 .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 的新特性之一并且现在被允许的信息。但是我发现其他一些(和较旧的)帖子像这个讨论一样,在这些情况下最好让编译器失败,因为从长远来看它会带来更多麻烦,现在这个功能已经消失了。
那么有没有人有关于这个特定新行为的一些链接或文档,如果这真的是有意的,思想改变的原因是什么?