【发布时间】:2010-02-09 18:49:28
【问题描述】:
是否可以从基于 T 的泛型类“向上转换”为基于比 T 更通用的泛型类?
例如,假设我有一个名为 Derived 的类,它继承自一个名为 Base 的类。我可以做这样的事情吗:
List<Derived> der = new List<Derived>();
List<Base> bas = (List<Base>) der;
或者,使用接口,有没有可能做这样的事情:
List<MyClonableType> specific = new List<MyClonableType>();
List<IClonable> general = (List<IClonable>)specific;
如此处所述,这些示例中的每一个都以InvalidCastException 失败。我们争论的问题是它实际上是不可能的,或者只是一个语法错误,如果我们知道如何解决的话。
【问题讨论】:
-
Java 有
<? extends X>用于这种类型的构造,我会很惊讶 C# 没有等价物。 -
C# 具有与扩展相同的通用约束(where 关键字),但我不肯定这就是 Auraseer 所追求的。他想从外观上实际使用该系列的差异。
-
@Romain,该转换在 C# 中无效,但您可以定义类似
void Process<T>(List<T> list) where T: Base {...}的方法 -
@finnw:我明白了……我猜
where约束涵盖了典型的用例。那里的语法有点重,不过(但比 Java 更灵活)