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?
}