【发布时间】:2016-11-20 00:35:24
【问题描述】:
我遇到了这样一种情况,List.AsReadOnly() 返回 ReadOnlyCollection 而不是 IReadOnlyCollection 让我很难过。由于返回的集合是Dictionary 的Value,因此无法自动向上转换为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]。)我理解为什么不能这样,因为接口可以有很多实现,并且将所有的字典的各个元素到请求的类型。除非我连这个简单的方面都吹了而且我不理解它,在这种情况下,我希望你能帮助我纠正...
【问题讨论】:
标签: c# .net readonly-collection