2010-06-28 3 views
7

Пример:Лямбда переменная сфера

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

var s = "s"; 

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

+0

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

ответ

8

Они противоречивы, потому что правило 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

+0

Хмм, я вспомнил кое-что о вашей публикации. Спасибо, что исправил меня. –

Смежные вопросы