Почему слежка за местными жителями в c # 8 разрешена? - PullRequest
2 голосов
/ 31 октября 2019

У меня есть решение с кучей проектов, все из которых работают на .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();

И скомпилировано без проблем! Где находится сообщение об ошибке 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);

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

Итак, есть ли у кого-нибудь ссылки или документация об этом конкретном новом поведении, и действительно ли это задумано, и каковы причины изменения разума?

...