通用类型定义子类型不会这样反映

时间:2011-06-29 18:41:01

标签: c# generics inheritance reflection

给出

public class Generic<T> {}
public class SubGeneric<T> : Generic<T> {}

以下所有内容均为假:

typeof(Generic<>).IsAssignableFrom(typeof(SubGeneric<>));
typeof(SubGeneric<>).IsSubclassOf(typeof(Generic<>));
typeof(SubGeneric<>).BaseType.Equals(typeof(Generic<>));

第一个是有意义的(直到具体它们不可分配)。但为什么这个行为会另外两个?

3 个答案:

答案 0 :(得分:2)

SubGeneric<T>继承Generic<T>,而不是Generic<>

如果继承Generic<>,它就无法传达足够的信息 考虑

之间的区别
class Wierd<T1, T2> : Generic<T1> { }

class Wierd<T1, T2> : Generic<T2> { }

甚至

class Wierd<T1, T2> : Generic<Wierd<T2, T1>> { }

BaseType包括基本类型的特定参数化。

typeof(SubGeneric<>).BaseType.GetGenericArguments()将返回一个包含SubGeneric<>通用类型参数(<T>)的数组。


typeof(SubGeneric<>).BaseType.GetGenericTypeDefinition() == typeof(Generic<>);

应该是真的。

答案 1 :(得分:1)

我认为在给出T之前这些断言是没有意义的。

SubGeneric<T>Generic<T>的子类,但SubGeneric<>Generic<>(没有任何T)根本不是类,不能从每个类派生一个其他,或者可能意味着任何SubGeneric<U>可能是Generic<V>的子类,这显然是不正确的。

答案 2 :(得分:0)

我认为这与通用参数有关。

SubGeneric<string>不是Generic<int>

的子类

因此,在不知道泛型参数的情况下,无法进行推理。

typeof(SubGeneric<int>).IsSubclassOf(typeof(Generic<int>));
typeof(SubGeneric<string>).BaseType.Equals(typeof(Generic<string>));

应该返回true