为什么可以在运行时继承泛型类型,而不能在编译时继承

本文关键字:继承 不能 编译 泛型类型 运行时 为什么 | 更新日期: 2023-09-27 18:05:22

所以我做了一些实验,我发现当这个:

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);
    }
}

工作好。如果我能在运行时这样做,那么在编译时使其可用似乎会节省很多麻烦。

为什么可以在运行时继承泛型类型,而不能在编译时继承

嗯,你也不允许在运行时这样做。

注意,在您的例子中,您是而不是指定要继承的类。

要做到这一点,您需要使用一个重载DefineType,它接受一个Type参数来继承。

但是,在运行时,您不允许为该参数指定T,您必须指定特定的类型,这与编译时没有区别。

使用反射的代码实际上定义了:

public class SuccessfulOf<T> : IMyInterface
{
}

你不能做你想做的(class FailureOf<T> : T),因为基本类型T必须在编译时已知。在运行时使用反射时,您仍然不能这样做,因为必须知道T

因为在第二段代码中,您声明的类型是public class FailureOf<T> : IMyInterface,而不是public class FailureOf<T> : T

即使在周围的类中声明泛型类型,仍然不能从它继承,因为不能继承类型参数。