2013-03-23 2 views
0

그래서 좀 번의 실험을하고 있었는데, 나는이 중에 발견 :런타임시 제네릭 형식에서 상속받을 수는 있지만 컴파일 시간이 아닌 이유는 무엇입니까?

public class SelfOfT 
{ 
    // This won't compile 
    public class FailureOf<T> : T 
    { 

    } 
} 

실패,이, 다른 한편으로는 :

public class SelfOfT 
{ 
    public interface IMyInterface 
    { 

    } 

    public static void Second() 
    { 
     // This works fine, and achieves the same end as what I'm trying to do with FailureOf<T> 
     AssemblyName name = new AssemblyName("Dynamics"); 
     AssemblyBuilder asmBuilder = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); 
     ModuleBuilder modbuilder = asmBuilder.DefineDynamicModule("MyModule"); 
     TypeBuilder typeBuild = modbuilder.DefineType("SuccessfulOf", TypeAttributes.Public); 

     typeBuild.AddInterfaceImplementation(typeof(IMyInterface)); 
     var TParam = typeBuild.DefineGenericParameters(new String[] { "T" }).First(); 
     TParam.SetGenericParameterAttributes(GenericParameterAttributes.None); 

     Type myType = typeBuild.CreateType(); 
     Type genericMyType = myType.MakeGenericType(typeof(IMyInterface)); 

     IMyInterface my = (IMyInterface)Activator.CreateInstance(genericMyType); 

    } 
} 

가 잘 작동합니다. 그것은 런타임에 어쨌든 그것을 할 수 있다면 그냥 컴파일 시간에 사용할 수 있도록 많은 문제를 저장하는 것 같습니다. 실제로 반사를 사용

+1

두 번째 스 니펫에서 'SuccessfulOf '이'T'를 확장한다고 선언합니까? – dtb

+0

대답을 바탕으로 내가 본 것은' '이 무엇인지 알고 있기 때문에 내가하고있는 일에서 벗어날 수 있습니다. 하지만 나는''을 단독으로 할 수 없다면 왜'IEnumerable '을 구현할 수 있습니까? 두 경우 모두 'T'는 알 수 없습니다. – sircodesalot

+0

@sircodesalot을': IEnumerable '와 함께 사용하면, 단순히 그 타입 인자를 전달할뿐입니다. 이는 임의의 유형에서 서브 클래스를 작성하거나 구현하는 것과는 전혀 다른 아이디어입니다. 그래서'class C : object, T'를 가질 수 없습니다. 언어가 그런 종류의 표현력을 허용한다면 흥미로울 것입니다. 그러나 C#은 그렇지 않습니다. –

답변

3

코드는 다음을 정의

public class SuccessfulOf<T> : IMyInterface 
{ 

} 

당신은 기본 유형 T은 컴파일 시간에 알려진해야하기 때문에 당신이 (class FailureOf<T> : T) 원하는 것을 할 수 없습니다. 런타임에서는 리플렉션을 사용하여 T을 알아야하기 때문에 여전히 수행 할 수 없습니다.

4

음, 런타임에 그렇게 할 수 없습니다.

귀하의 경우에는 이 아니며, 상속 할 클래스를 지정하는 것이임을 유의하십시오.

이렇게하려면 매개 변수를 상속 받아 사용하는 오버로드 중 하나를 DefineType으로 사용해야합니다.

그러나 실행시에 해당 매개 변수에 T을 지정하는 것은 허용되지 않으므로 특정 유형을 지정해야합니다. 이는 컴파일 시간과 차이가 없습니다.

1

public class FailureOf<T> : IMyInterface이 아닌 두 번째 코드에서 public class FailureOf<T> : T을 선언했기 때문에.

주변 클래스에 제네릭 형식을 선언하더라도 형식 매개 변수를 상속받을 수 없기 때문에 주변 클래스에서 상속 할 수 없습니다.