Skip to main content
 首页 » 编程设计

c#之使用自定义集合类时接口(interface)不再工作

2024年02月23日29wuhuacong

我创建了一个类,MonitoredCollection<T> ,它基本上封装/模仿 List 但允许我在某些调用上触发事件。

但是现在,无论哪里有采用 MonitoredCollection 的参数,其中 T 是一个接口(interface),我都无法再传递 MonitoredCollection<T>。其中 T 是实现该接口(interface)的类,就像我可以使用 List 一样.

我一直认为接口(interface)是一种语言“特性”,因此我不需要再实现任何东西来支持它,所以我错过了什么?

编辑:抱歉,我在那个问题上犯了一个错误,因为 João 正确地指出 List 在这种情况下从未起作用,所以问题是没有它的情况!

请您参考如下方法:

假设您有一个 MonitoredCollection<SomeObject>实例,并且您想将其视为 MonitoredCollection<ISomeInterface>实例 SomeObject实际上执行 ISomeInterface .这不会对从集合中检索项目造成任何问题,因为类型为 SomeObject 的对象可以转换为接口(interface)类型ISomeInterface .

但是,对于集合中所有修改集合的方法,例如为索引分配新值或向集合中插入新项的方法,此转换会产生一整套问题。我假设你的 MonitoredCollection<SomeObject>实例将有一个方法,例如 Add(SomeObject obj) ,这会将一个新对象插入到集合中。转换后,此方法的签名将为 Add(ISomeInterface obj) .这似乎有道理,但并非所有ISomeInterface对象是必要的 SomeObject实例。

因为转换后的对象将允许对原始对象不允许的集合进行操作,所以运行时将不允许此转换。 C# 4.0 引入了协变和逆变来明确说明什么对这种类型的转换有效,您可以查看它们以尝试解决此问题。然而,您真的只能幸运地使用您收藏的只读版本(想想 List<T>.AsReadOnly() )。