C#genericsinheritance和协方差
我正在构建一个集合库,我希望所有通用集合接口都需要类类型,并且所有实现它们的集合都是任何类型。 所以在值类型上,集合将有两个方法,一个用于值类型,另一个用于装箱。 这可能吗?
像这样:
interface ICollection where ItemType : class { void DoSomething(ItemType item); } class Collection : ICollection { void DoSomething(Object item); void DoSomething(ItemType item); }
除非最好的解决方法是什么? 接口是非通用的?
这条线:
ICollection
(评论)可以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
加框。 这将强制任何盒装值类型的Collection
是Collection
,它实际上不是类型安全的(没有人阻止你添加例如string
)。 类型安全性是通用类型的最大优势之一。 所以如果可能的话,我建议删除class
约束。
顺便说一句:你仍然可以将这些通用接口(没有class
约束)分配给它们的非通用版本:
IList l = new List