【问题标题】:Can an object with different generic types be added to a single container可以将具有不同泛型类型的对象添加到单个容器中吗
【发布时间】:2014-02-08 16:06:38
【问题描述】:

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

class abstract absgentype { }

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

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

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

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

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

【问题讨论】:

  • 基本上,您可以将所有内容存储在ArrayList 中,但您仍然需要进行投射,因为ArrayList 将项目存储为object
  • 另一种方法是让集合中的所有类型都实现一个公共接口,然后具有泛型类型 T 其中 T : IYourIterface

标签: c# generics containers


【解决方案1】:

不,因为您试图使 pcompile-time 类型依赖于集合中值的 execution-time 类型。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多