1

我正在构建一个集合库,我希望所有通用集合接口都需要类类型,并且所有实现它们的集合都是任何类型。因此,在值类型上,集合将有两种方法,一种用于值类型,另一种用于装箱。这可能吗?

像这样:

interface ICollection<ItemType> where ItemType : class
{
    void DoSomething(ItemType item);
}

class Collection<ItemType> : ICollection<ItemType>
{
    void DoSomething(Object item);
    void DoSomething(ItemType item);
}

除非这样,最好的解决方法是什么?接口是非通用的?

4

2 回答 2

3

该行:

ICollection<Object> s = new Collection<String>();

(评论)将与out差异一起工作;但是,DoSomething(ItemType)将需要in差异;所以该类型既不是in也不是out:方差在这里不适用

通常处理的方式是使用通用非通用 API。对特定类型感兴趣的人可以使用通用 API;只对“对象”感兴趣的人可以使用非通用 API。

举例说明:

interface ICollection
{
    void DoSomething(object item);
}
interface ICollection<ItemType> : ICollection
{
    void DoSomething(ItemType item);
}

class Collection<ItemType> : ICollection<ItemType>
{
    void ICollection.DoSomething(Object item)
    {
        DoSomething((ItemType)item);
    }
    public void DoSomething(ItemType item)
    {
        //...
    }
}

然后这个工作:

ICollection s = new Collection<String>();
object o = "abcd";
s.DoSomething(o);
于 2013-01-10T07:47:44.037 回答
0

值类型总是装箱为 type object。这将强制任何装箱值类型的集合为 a Collection<object>,这不是真正的类型安全(没有人阻止您添加例如 a string,然后)。不过,类型安全应该是泛型类型的最大优势之一。因此,如果可能的话,我建议放弃class约束。

顺便说一句:您仍然可以将这些通用接口(无class约束)分配给它们的非通用版本:
IList l = new List<int>();

于 2013-01-10T07:48:43.570 回答