Использование имени переменной, используемого в дочерней области

Мне было интересно, почему в С# использование имени переменной, используемого ранее в дочерней области, недопустимо. Вот так:

if (true)
{
    int i = 1;
}

int i = 2;

Компиляция вышеуказанного кода вызывает ошибку:

Локальная переменная с именем 'i' не может быть объявлено в этой области, поскольку означало бы "i", который уже используется в "ребенке", область для обозначения чего-то еще

И все же вы не можете использовать переменную, определенную в области содержимого. В приведенном выше коде отлично работает Java, и я не вижу причин, почему он не работает на С#. Я уверен, что есть веская причина, но что это?

Ответы

Ответ 1

Это дизайн, сделанный дизайнерами С#. Это уменьшает потенциальную двусмысленность.

Вы можете использовать его в одном из двух мест, внутри if или снаружи, но вы можете определить его только в одном месте. В противном случае вы получите ошибку компилятора, как вы нашли.

Ответ 2

Что-то я заметил, что здесь не было отмечено. Это скомпилирует:

for (int i = 0; i < 10; i++)
{
    int a = i * 2;
}
for (int i = 0; i < 5; i++)
{
    int b = i * 2;
}

Взятые вместе, эти проектные решения кажутся непоследовательными или, по крайней мере, странно ограничительными и разрешительными, соответственно.

Ответ 3

Как сказал Адам Кроссленд, это выбор дизайна. Сделано, чтобы убедиться, что вы (или, скорее всего, ваши коллеги-разработчики) не понимаете код.

Вы часто видите частные члены экземпляра с префиксом "m_" или "_" (например, _myVar или m_myVar), чтобы избежать путаницы.

Ответ 4

по всей вероятности, любая переменная, созданная в любой из дочерней области, будет помещена в стековый фрейм, когда вводится метод метода.

Таким образом, подобное имя в дочерней области не может сосуществовать с именем переменной в другой дочерней области.

Они могли бы обойти это, конечно, если бы захотели, поэтому я думаю, что это в конечном итоге связано и с дизайном... таким образом, вероятность ошибок меньше.