gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:16:23 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com