Они противоречивы, потому что правило 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
См: http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -not-so-simple.aspx –