我遇到了一个案例,List.AsReadOnly()
返回 aReadOnlyCollection
而不是a 的事实IReadOnlyCollection
对我来说很困难。由于返回的集合是Value
a 的Dictionary
,它不能自动向上转换为 a IReadOnlyCollection
。这看起来很奇怪,在查看 .Net 源代码后,我确认该AsReadOnly()
方法的作用List
与它的作用不同Dictionary
,即返回具体类而不是接口。
谁能解释这是为什么?出现这种不一致似乎是一种伤害,特别是因为我们希望尽可能使用接口,尤其是在公共时。
在我的代码中,我起初在想,由于我的消费者只是一个私有方法,我可以将其参数签名从 更改IReadOnlyDictionary<T, IReadOnlyCollection<T>>
为IReadOnlyDictionary<T, ReadOnlyCollection<T>>
。但是,后来我意识到这使得私有方法看起来可能会修改集合值,所以我在前面的代码中添加了一个烦人的显式转换,以便正确使用接口:
.ToDictionary(
item => item,
item => (IReadOnlyCollection<T>) relatedItemsSelector(item)
.ToList()
.AsReadOnly() // Didn't expect to need the direct cast
)
哦,由于我总是混淆协变和逆变,有人可以告诉我哪个阻止了自动转换,并尝试以一种明智的方式提醒我如何在未来记住它们?(例如,对于_____ [输入/输出]参数,集合不是____variant [co/contra]。)我理解为什么不能这样,因为接口可以有很多实现,并且将所有的字典的各个元素到请求的类型。除非我连这个简单的方面都吹了而且我不明白,在这种情况下,我希望你能帮助我纠正...