2010-06-28 6 views
7

예 :람다 변수 범위

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

var s = "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

흠, 게시 내용에 대해 기억하고 있습니다. 나를 고쳐 주셔서 고마워요. –