我需要一个包含一组"泛型"的数组。对象,其中数组中的每个元素可能具有相同的泛型类型,或者不同。我能解决这个问题的唯一方法是使通用对象具有基类,并且该数组用于一组基类对象。
class abstract absgentype { }
class gentype<T> : absgentype
{
T value;
...
}
不幸的是,一个不好的副作用是,当我查看数组的内容时,我必须使用强制转换来返回实际对象,并且我必须知道要执行转换的泛型类型
有没有办法构建一个容器,可以包含具有不同泛型类型的泛型的多个对象?理想情况下我想这样做:
var p = genarray[0]; // type of p is whatever type was put into array
我不想使用类型对象或动态,因为我失去了静态输入...
答案 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
的类型......如果可以根据集合中的内容进行更改,则无法在编译时做出决定...它不能是有效的和都无效。