Имя лямбда-параметра (иногда) конфликтует с локальным именем - PullRequest
4 голосов
/ 06 марта 2020

Существует два проекта, один из которых предназначен для библиотеки. NET Standard 2.0, а другой - для консольного приложения. NET Core 2.2.

Теперь этот фрагмент кода работает. NET Стандартная библиотека 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 Стандартная библиотека 2.0 должна выдавать ошибку, но это не так. Почему это несоответствие?

Я пытался сделать tnet fiddle, и, похоже, он работает на. NET Core 3.1 и Roslyn 3.4, но не. NET Framework 4.7.2, что даже более запутанным. Что здесь происходит?

1 Ответ

5 голосов
/ 06 марта 2020

Что здесь происходит?

По сути, возможность использовать параметр лямбда-выражения с тем же именем, что и у существующей локальной переменной, является новой функцией, введенной в C# 8 компилятор - но было очень мало суеты об этом. Я случайно услышал об этом (от самого Мэдса) на собрании на этой неделе, но иначе не знал бы об этом.

Целевая структура имеет значение, потому что она изменяет по умолчанию языковая версия, к которой применяется компилятор . Вы можете указать это явно, используя элемент <LangVersion>. Например, с этим файлом проекта:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net471</TargetFramework>
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>
</Project>

... код строится нормально. То же самое при нацеливании на netstandard2.0 или netcoreapp2.2.

...