Использование имени переменной, используемого в дочерней области
Мне было интересно, почему в С# использование имени переменной, используемого ранее в дочерней области, недопустимо. Вот так:
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
по всей вероятности, любая переменная, созданная в любой из дочерней области, будет помещена в стековый фрейм, когда вводится метод метода.
Таким образом, подобное имя в дочерней области не может сосуществовать с именем переменной в другой дочерней области.
Они могли бы обойти это, конечно, если бы захотели, поэтому я думаю, что это в конечном итоге связано и с дизайном... таким образом, вероятность ошибок меньше.