2009-11-17 2 views
0

이 클래스는 어떻게 컴파일됩니까? I는 원형 기준 컴파일 오류를 예상 한 어떤 이유> ReflectionHelper < 유형에 referance에 있습니다 ReflectionHelper에서어떻게 기본 클래스가 수퍼 유형을 참조하고 컴파일 할 수 있습니까?

public class ReflectionHelper 
{ 
    public static IReflectionHelper CreateHelper(object subject) 
    { 
     return (IReflectionHelper)Activator.CreateInstance(typeof(ReflectionHelper<>).MakeGenericType(GetFirstGenericArgument(subject))); 
    } 
    public static Type GetFirstGenericArgument(object subject) 
    { 
     return subject.GetType().GetGenericArguments()[ 0 ]; 
    } 
} 

public class ReflectionHelper<T> : ReflectionHelper, IReflectionHelper where T : new() 
    {} 

공지 ReflectionHelper <T> 상속한다.

답변

4

방법이 클래스는 컴파일 무엇입니까?

매우 잘 부탁드립니다.

어떤 이유로 나는 순환 참조 컴파일 오류가 예상됩니다.

왜 그렇게 기대하는지 모르겠습니다. 당신이 순환 참조 오류가 발생하는 상황은 다음과 같습니다

1) 기본 클래스를 포함하는 순환 참조 루프 : 흥미롭게도

class C : B {} 
class B : C {} 

, 실제로

을하지 않은 C# 2.0 사양의 엄격한 읽기
class C : C {} 

물론 불법이지만 컴파일러는 이것을 잡았습니다. 우리는 사양을 수정했습니다. ENUM 부재에

class C<T, U> where T : U 
       where U : T 

4) 원형도 :도

enum E { A = B, B = A } 

참고

2) "기본 인터페이스"를 포함 유사 순환 참조 타입 파라미터 제약에

3) 원형도 루프 외부 클래스가 내부 클래스에서 상속하는 것은 불법이지만 반대가 유효합니다.

이러한 것들이 즉시 마음에 듭니다. 나는 하나 또는 두 개의 실종 된 것 같아.

C#주기 감지기에는 몇 가지 알려진 버그가 있습니다. 예를 들어, 사이클 오류로 컴파일러 플래그이 아닌 경우에도 : 내가 설계 및 C# 4에 대한 개선주기 탐지 알고리즘을 구현하지만, 불행히도 수정이 너무 복잡하고 내 광범위한했다

class November<T> {} 
class Romeo : November<Romeo.Sierra.Tango> 
{ 
    class Sierra { class Tango { } } 
} 

컴파일러 구현으로 C# 4를 사용하기로 결정했습니다. 오히려 큰 변화를 검증하는 테스트 부담을 감수해야합니다.실제로 실제로 불법으로 잘못 작성된 사례는 애매 모호하며 실제 응용 프로그램에서 자주 제기되지 않습니다.

그러나 귀하의 케이스에는 분명히 순환이 없습니다. 왜 사이클이 있다고 생각합니까?

5

"실제로는 문제가 아닌 이유를 설명하기 위해"어떤 이유로 "정성을 기울여야합니다. .NET의 모든 곳에서 순환 참조가 존재합니다. 동일한 어셈블리 내에 있으면 순환 참조가 문제가되지 않습니다. 간단한 제네릭이 아닌 예를 들어 :

// Compiles with no problem 
class Foo 
{ 
    Bar other; 
} 

class Bar 
{ 
    Foo other; 
} 

(.이 어셈블리 BCL 내 참조가 실제로 원형 ...하지만 그건 그냥 불쾌한의 악)

+0

나는이 질문이 "어떻게 가능합니까?"라고 생각합니다. 다른 언어에서 온 경우이 순환 참조는 불가능합니다. Attribute 클래스에 적용된 속성을 살펴보면 두뇌가 아플 수 있습니다. –

+0

컴파일러는 나머지 클래스를 컴파일하기 전에 컴파일 할 모든 클래스에서 충분한 정보를로드합니다. 다행히도 우리는 오래된 언어의 제약이 없습니다 :) –

관련 문제