C# 可以将具有不同泛型类型的对象添加到单个容器中吗

C# 可以将具有不同泛型类型的对象添加到单个容器中吗,c#,generics,containers,C#,Generics,Containers,我需要一个包含一组“泛型”对象的数组,其中数组中的每个元素可能具有相同的泛型类型,也可能不同。我能解决这个问题的唯一方法是让泛型对象有一个基类,而数组是一组基类对象 class abstract absgentype { } class gentype<T> : absgentype { T value; ... } 我不想使用类型对象或动态,因为我丢失了静态类型…否,因为您试图使p的编译时类型取决于集合中值的执行时类型 假设您正在编写一个编译器,并且提供了以下代

我需要一个包含一组“泛型”对象的数组,其中数组中的每个元素可能具有相同的泛型类型,也可能不同。我能解决这个问题的唯一方法是让泛型对象有一个基类,而数组是一组基类对象

class abstract absgentype { }

class gentype<T> : absgentype
{
    T value;
    ...
}

我不想使用类型对象或动态,因为我丢失了静态类型…

否,因为您试图使
p
的编译时类型取决于集合中值的执行时类型

假设您正在编写一个编译器,并且提供了以下代码:

public void Foo(MagicCollection collection)
{
    var x = collection[0];
    ...
}
在编译时,您如何推断
x
的类型?可以从具有不同集合的多个位置调用此方法,这些集合具有不同的第一个值。。。但是
x
的类型必须在编译时确定一次

或者换一种说法,让我们添加另一行:

public void Foo(MagicCollection collection)
{
    var x = collection[0];
    x.Bar(); // is this line valid?
}

静态类型的要点是编译器可以决定
Bar()
调用是否有效。要知道这一点,它需要知道
x
的类型。。。如果这可以根据集合中的内容进行更改,则无法在编译时做出决定。。。它不能同时有效和无效。

基本上,您可以将其全部存储在
ArrayList
中,但您仍然必须强制转换,因为
ArrayList
将项目存储为
对象。
另一种方法是让集合中的所有类型实现一个公共接口,然后是泛型类型T,其中T:iYourInterface
public void Foo(MagicCollection collection)
{
    var x = collection[0];
    x.Bar(); // is this line valid?
}