2010-06-28 11 views
7

Ejemplo:Lambda ámbito de variable

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

var s = "s"; 

Una variable "s" se define en un lambda y otra variable "s" como una variable local dentro del mismo método. Visual Studio me dice "Una variable conflictiva se define a continuación" cuando coloco el cursor sobre la primera "s". ¿Por qué son estos conflictivos? la "s" en la lambda no está disponible fuera de sus corchetes ¿verdad?

+0

Ver: http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -no-tan-simple.aspx –

Respuesta

8

Son conflictivos porque una regla de C# es que dos posibles usos del mismo nombre simple no se pueden usar para referirse a dos cosas diferentes dentro del bloque que encierra inmediatamente a cualquiera de ellos. En su ejemplo, el nombre simple "s" se usa para referirse a dos cosas dentro del bloque que encierra la declaración de la variable local: significa una variable local y un parámetro lambda. Eso es lo que es ilegal. Tomo nota de que el mensaje de error que se obtiene te dice esto:

 
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# no le permiten tener el mismo nombre sencillo significa dos cosas en el mismo bloque, ya que hacerlo hace propenso a errores de código, difícil de editar, dura para leer, difícil de refactorizar, y difícil de depurar. Es mejor no permitir esta mala práctica de programación que permitirlo y arriesgarse a que cause errores porque asumió que "s" significa lo mismo en todo el bloque.

Cuando el código tiene solo dos líneas, es fácil recordar que hay dos significados diferentes para s, pero cuando tiene cientos de líneas, no es tan fácil.

Para obtener más información acerca de esta regla, consulte:

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

+0

hmm, recordé algo acerca de su publicación. Gracias por corregirme. –

Cuestiones relacionadas