Объем переменной лямбды

Пример:

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh");

var s = "s";

Переменная "s" определяется в лямбде и другой переменной "s" как локальная переменная в рамках того же метода. Visual Studio говорит мне "Конфликтующую переменную, определяется ниже", когда я нависаю над первым "s". Почему они конфликт; "s" в лямбде не доступен за пределами ее скобок включения, конечно?

7
задан Ben 28 June 2010 в 15:20
поделиться

1 ответ

Они конфликтуют, потому что правило C # состоит в том, что любые два использования одного и того же простого имени не могут использоваться для ссылки на две разные вещи внутри блока, непосредственно включающего любую из них. В вашем примере простое имя «s» используется для обозначения двух вещей внутри блока, содержащего объявление локальной переменной: это означает локальную переменную и лямбда-параметр. Это незаконно. Я отмечаю, что сообщение об ошибке, которое вы получаете, сообщает вам следующее:

A local variable named 's' cannot be declared in this scope because it
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else

C # не позволяет вам иметь одно и то же простое имя, означающее две вещи в одном блоке, потому что это делает код подверженным ошибкам, его трудно редактировать, трудно читать, трудно для рефакторинга и трудной для отладки. Лучше запретить эту плохую практику программирования, чем позволить ее и рискнуть вызвать ошибки, потому что вы предполагали, что "s" означает одно и то же во всем блоке.

Когда код состоит всего из двух строк, легко запомнить, что s имеет два разных значения, но когда он состоит из сотен строк, это не так просто.

Для получения дополнительной информации об этом правиле см .:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx

8
ответ дан 7 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: