ОБНОВЛЕНИЕ: ответ ниже 2011 года является правильным для более ранних версий C #; в более поздних версиях описанное правило ответ был удален из C #. Команда разработчиков определила, что это правило вызывало у разработчиков больше путаницы, что приводило к таким вопросам, чем те, которые мешали ошибочные программы, даже если я значительно улучшил сообщения об ошибках, чтобы более четко диагностировать проблему.
Ответы, данные до сих пор, очень запутаны. Правильный анализ проблемы начинается с чтения сообщения об ошибке . Сообщение об ошибке говорит вам, что на самом деле не так:
"Локальная переменная с именем" матрица "не может быть объявлена в этой области, потому что она придала бы другое значение" матрице ", которая уже используется в" дочерней "области для обозначения чего-то другого.
Внимательно прочитайте . Это точно говорит вам, какое правило C # нарушается, а именно , что вы не можете использовать одно и то же имя для ссылки на две разные вещи в одной и той же области действия . (На самом деле, сообщение об ошибке немного неверно; оно должно содержать «пространство объявления локальной переменной», где оно говорит «область действия», но это довольно многословно.)
Это правило задокументировано в спецификации C # 4.0, раздел 7.6.2.1: Простые имена, Инвариантное значение в блоках.
( также недопустимо иметь две локальные переменные с одинаковыми именами в перекрывающихся пространствах объявлений. Компилятор может также сообщать об этой ошибке, но в этом случае он сообщает о более общей ошибке.)
Разве эти переменные не находятся в разных областях, так что я бы не смог получить доступ к первой матрице извне оператора if?
Да. Это утверждение верно , но не имеет значения . Ошибка здесь в том, что одно и то же простое имя использовалось для ссылки на две разные вещи в одном и том же пространстве объявления локальной переменной .
Рассмотрим этот сценарий:
class C
{
int x;
void M()
{
x = 10; // means "this.x"
for(whatever)
{
int x = whatever;
}
}
}
Та же сделка. Ошибка здесь в том, что простое имя «x» использовалось во внешнем пространстве объявлений для ссылки на this.x, и использовалось во внутреннем пространстве объявлений для обозначения «локальной переменной». Использование одного и того же простого имени для ссылки на две разные вещи в одном и том же пространстве объявлений - помните, что внутреннее пространство объявлений представляет собой часть внешнего - оба сбивают с толку и опасно и, следовательно, незаконно.
Это сбивает с толку по понятным причинам; можно разумно ожидать, что имя будет означать одно и то же везде во всем пространстве объявления, в котором оно впервые используется. Это опасно, потому что небольшие изменения кода склонны к изменению значения:
class C
{
int x;
void M()
{
int x;
x = 10; // no longer means "this.x"
for(whatever)
{
x = whatever;
}
}
}
Если пространства объявлений, в которых впервые используются простые имена, не перекрываются , то для простых имен допустимо ссылаться на разные вещи:
class C
{
int x;
void M()
{
{
x = 10; // means "this.x"
}
for(whatever)
{
int x = whatever; // Legal; now the
}
}
}
Для получения дополнительной информации и забавной истории о жареной пище см.
http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/