2010-05-13 5 views
8

2 가지 시나리오가 있습니다.C에서 형식 매개 변수의 '어휘'범위 지정

이 실패

class F<X> 
{ 
    public X X { get; set; } 
} 

오류 CS0102을 : 유형 'F<X>가'이미에 대한 정의를 포함 'X'

이 작동 :

class F<X> 
{ 
    class G 
    { 
    public X X { get; set; } 
    } 
} 

유일한 논리적 인 설명을 두 번째 스 니펫에서 type 매개 변수 X가 범위를 벗어났습니다. 사실이 아닙니다.

형식 매개 변수가 형식에서 내 정의에 영향을주는 이유는 무엇입니까?

IMO는 일관성을 위해 둘 다 작동해야하거나 작동하지 않아야합니다.

다른 아이디어?

추신 : 저는 이것을 '어휘'라고 부르지 만 올바른 용어는 아닙니다.

업데이트 :

헹크의 대답은 당으로, 여기에 제네릭이 아닌 동일한 동작을 표시 버전 만 grok 수에 아마 쉽다.

실패 :

class F 
{ 
    class X { } 
    public X X { get; set; } 
} 

작품 : 내가 무엇을 볼 수에서

class X { } 
class F 
{ 
    public X X { get; set; } 
} 

는, C# 컴파일러가 타입 정의 boundries에서 어휘 범위를 만듭니다.

또한 유형과 구성원 이름이 동일한 '위치'(또는 LISP 측면에서 namespace)에 있다는 것을 의미합니다.

+0

나는 왜 처음 작동하지 않습니까? 누구든지 컴파일러 오류를 재현 할 수 있습니까? –

+0

@Ori : 그냥 사용해보십시오. :) – leppie

+0

업데이트에 따르면 마르셀로가 귀하의 질문에 답변 한 것처럼 보입니다. 그는 똑같은 것을 보여주었습니다. – Kobi

답변

3

클래스 G는 고유 한 명명 범위를 도입합니다. 기본 규칙을 생략하면 다음 두 버전이됩니다.

public F<X>.X F<X>.X { get; set; } // error 
public F<X>.X F<X>.G.X { get; set; } // OK 
+0

감사합니다, 조금 이해가 :) :) 그리고 이유 : 클래스 F { 클래스 X {} public X X {get; 세트; } } 도 실패합니다. – leppie

2

XF의 범위에 속하는 유형으로 정의됩니다.

class F 
{ 
    public void X(); 

    public int X(); // Bad, trying to redefine X. 

    class G 
    { 
    public string X(); // OK, different scope 
    } 
} 

F.XG의 범위를 벗어나 아니라,이 새로운 X을 정의에서 G을 중지하지 않습니다 : 그것은이 유사하다.

+0

죄송합니다. 귀하의 X는 회원이며, 제 타입 매개 변수입니다. 나는 그것을 이해할 수있다. – leppie

+0

미안하지만, @leppie. 나에 동의 하냐, 아니면 동의하지 않니? –

+0

나는 동의하지 않습니다. :) – leppie

관련 문제