如何创建从具有不同类型的相同泛型类继承的对象列表?

yaz*_*ack 3 c# generics

我花了几个小时上下试图找到答案,我可能无法正确写出问题,这没有用.基本上,我有一个抽象类:

public abstract class GenericType<T>
{ ... }
Run Code Online (Sandbox Code Playgroud)

还有一堆继承自它的类:

public class AType: GenericType<A>
{ ... }

public class BType: GenericType<B>
{ ... }

...
Run Code Online (Sandbox Code Playgroud)

最后,我有另一个类想要包含从GenericType继承的事物列表,无论T的值是什么,即Atypes,BTypes等等.

我的第一次尝试是使用List<GenericType>,List<GenericType<Object>>但是他们给了我任何快乐.

关于我应该怎么做的任何提示?非常感谢!

Eri*_*ert 11

如何创建一个通用的对象列表,这些对象被约束为从使用不同类型参数构造的同一泛型类继承?

这在C#类型系统中是不可能的; 你只能制作一个实际类型的列表,而不是"类型模式"的列表,例如" List<U>U必须是Foo<T>某些未指定的T".

为了明白为什么不可能,让我们假设这是可能的.我们将"类型模式"注释为问号:

class Stack<T> { ... }
...
List<Stack<?>> listOfStacks = new List<Stack<?>>();
listOfStacks.Add(new Stack<int>());
listOfStacks.Add(new Stack<Giraffe>());
Run Code Online (Sandbox Code Playgroud)

太好了.现在你打算怎么处理堆栈列表?对于涉及堆栈类型参数的堆栈, 您无法安全地执行任何操作:

listOfStacks[0].Push("hello");
Run Code Online (Sandbox Code Playgroud)

这应该在编译时失败,因为插槽零中的堆栈是一堆int而不是字符串.编译器怎么知道呢? 编译器无法知道.通过允许此功能,您实际上破坏了编译器对您的程序进行类型检查的能力.

回答"我怎么做这件事是不可能的?" 了解你为什么要做不可能的事情是有帮助的.而不是试图做这个不可能的事情告诉我们你真正想做什么,看看是否有人可以解决真正的问题.


Tej*_*ejs 8

所以,如果我理解正确,你想要这样的东西:

List<GenericType>
Run Code Online (Sandbox Code Playgroud)

它可以包含的任何实例AType,BType等您只需通过使这样做GenericType<T>本身的一个子类GenericType:

public class GenericType { }
public class GenericType<T> : GenericType { }
public class AType : GenericType<int> { }
public class BType : GenericType<int> { }
Run Code Online (Sandbox Code Playgroud)

然后你可以将任何实例粘贴到一个List<GenericType>.