Чому компілятор C # дозволяє дублювати змінну у вкладеній області?


18

Історично під час розвитку в .Net я не міг дублювати ім'я змінної в вкладеній області. Однак, нещодавно оновивши Visual Studio 2019 до версії 16.4.2, я помітив, що імена змінних можна дублювати у вкладеній області.

Наприклад:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

Чому це раптом дозволено?

Подальше запитання: Якщо це нова "особливість" мови, чи існує спосіб налаштування Visual Studio продовжувати ламати, коли змінна дублюється в вкладеній області?


2
Я не думаю, що це дозволяє повторювати змінну. його використовується однакова testзмінна, оскільки тип даних однаковий. спробуйте оголосити testзмінну як int напр. var test = 12345;Я думаю, ви повинні отримати помилку компіляції. (Я не пробував)
LP13

1
@ LP13 Зміна типу testзапропонованого варіанту не впливає. Ви можете спробувати це у Fiddle, пов'язаному у питанні.
Емі

1
Незважаючи на те, цільова рамка не має значення. Нова поведінка пояснюється мовною версією. Код складається на C # 8, він не компілюється на C # 7.3 (і я припускаю, що нижче)
Емануель Вінтілья


6
Для цього існує проблема GitHub . Етап встановлений 16,5. @OrkhanAlikhanov Ви знайшли це швидше :)
Павло Аніхоускі

Відповіді:


1

Це нова функція в C # 8.0, локальні функції та параметри лямбда можуть затінювати зовнішні імена.


0

я гадаю, що функція вибору компілюється як статична, оскільки вона не має з'єднань з тілом методу хоста. він просто друкує та повертає предмет, про який йде мова. це не потребує доступу до методу і, як такий, його можна з міркувань оптимізації винести з тіла методу і самостійно поставити в межах глобальної сфери.

і в цьому випадку ця тестова змінна є її власною змінною і не має з'єднання з вищевказаною тестовою змінною.

що стосується запобігання цього, ви не можете сказати, щоб кидати помилку, коли вона виникає, вам просто доведеться змінити ім'я змінної вручну.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.