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

时间:2014-02-08 16:06:39

标签: c# generics containers

我需要一个包含一组"泛型"的数组。对象,其中数组中的每个元素可能具有相同的泛型类型,或者不同。我能解决这个问题的唯一方法是使通用对象具有基类,并且该数组用于一组基类对象。

class abstract absgentype { }

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

不幸的是,一个不好的副作用是,当我查看数组的内容时,我必须使用强制转换来返回实际对象,并且我必须知道要执行转换的泛型类型

有没有办法构建一个容器,可以包含具有不同泛型类型的泛型的多个对象?理想情况下我想这样做:

var p = genarray[0];    // type of p is whatever type was put into array

我不想使用类型对象或动态,因为我失去了静态输入...

1 个答案:

答案 0 :(得分:7)

不,因为您尝试使编译时类型的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的类型......如果可以根据集合中的内容进行更改,则无法在编译时做出决定...它不能是有效的都无效。