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

标签 c# list collections interface

我创建了一个类,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() )。

关于c# - 使用自定义集合类时接口(interface)不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021678/

相关文章:

python - 为什么在修改列表实例时存储对 pop 的函数调用不返回最后一项?

c# - 优化 C# 代码片段、ObservableCollection 和 AddRange

c# - UWP : Binding selected date in calendarview

c# - 制作二维数组/集合类的最佳实践

c# - 动态业务规则

python - Scrapy:如果 key 存在,为什么会出现 KeyError?

python - 如果字符串存在于列表中,则替换整个数据框中的字符串

Java Collection-ArrayList 和 Vector 之间的加速

java - 流列表成一个集合

c# - 使用 Windows 原则/角色以编程方式控制对控件/窗体的访问 - C#