C#genericsinheritance和协方差

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

像这样:

interface ICollection where ItemType : class { void DoSomething(ItemType item); } class Collection : ICollection { void DoSomething(Object item); void DoSomething(ItemType item); } 

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

这条线:

 ICollection s = new Collection(); 

(评论)可以out方差; 但是, DoSomething(ItemType)需要有所不同; 所以类型既不是in也不是out :variance 不适用于此处

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

例如:

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

然后工作:

 ICollection s = new Collection(); object o = "abcd"; s.DoSomething(o); 

值类型始终作为类型object加框。 这将强制任何盒装值类型的CollectionCollection ,它实际上不是类型安全的(没有人阻止你添加例如string )。 类型安全性是通用类型的最大优势之一。 所以如果可能的话,我建议删除class约束。

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