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

3

考虑到

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个回答

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

应该是真的。


所以 BaseType 的不等价是清楚的,谢谢。但是 IsSubclassOf 的错误仍然让人感到困惑。考虑到这两个通用类型定义之间的关系,为什么它不显示它们之间的继承语义呢? - Marc L.
@Marc:看看我的例子。Wierd<T1, T2>不是Generic<>的子类;它是Generic<T1>的子类。 - SLaks

1

我认为在给定一个 T 之前,这些断言都没有意义。

SubGeneric<T>Generic<T> 的子类,但是没有任何 TSubGeneric<>Generic<> 都不是类,也不能相互继承,否则就意味着任何 SubGeneric<U> 都可以成为 Generic<V> 的子类,这显然是不正确的。


0

我认为这与泛型参数有关。

SubGeneric<string>不是Generic<int>的子类

因此,如果不知道泛型参数的情况下,就无法进行推断。

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

应该返回true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接