【问题标题】:What Causes this System.InvalidCastException?是什么导致了这个 System.InvalidCastException?
【发布时间】:2018-10-17 01:54:20
【问题描述】:

当我尝试以下操作时,我看到了System.InvalidCastException

IReadOnlyDictionary<string, IReadOnlyCollection<MyType>> results = new ConcurrentDictionary<string, ConcurrentBag<MyType>>();

我不明白此错误消息的根本原因:

ConcurrentBag 实现 IReadOnlyCollection,ConcurrentDictionary 实现 IReadOnlyDictionary。

为什么转换失败?

【问题讨论】:

标签: c# casting covariance


【解决方案1】:

而不是这个:

IReadOnlyDictionary<string, IReadOnlyCollection<MyType>> results = new ConcurrentDictionary<string, ConcurrentBag<MyType>>();

你需要这样做:

ConcurrentDictionary<string, IReadOnlyCollection<MyType>> results = new ConcurrentDictionary<string, IReadOnlyCollection<MyType>>();

ConcurrentDictionary<string, ConcurrentBag<Point>> results = new ConcurrentDictionary<string, ConcurrentBag<Point>>();

这称为协方差限制。这里有更多关于它的阅读: 基本上,如果你有一个父容器,你可以把任何派生类放进去。但是如果你有一个孩子的容器,那么你不能把父母放在里面。

在瀑布中,水从上往下落。

https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/dd799517(v=vs.100)

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2011-02-12
    • 2011-11-27
    • 2015-09-08
    • 2012-01-22
    • 1970-01-01
    • 2012-01-29
    • 2014-11-07
    相关资源
    最近更新 更多