Что вызывает это исключение System.InvalidCastException? - PullRequest
0 голосов
/ 17 октября 2018

Я вижу System.InvalidCastException при попытке выполнить следующее:

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

Я не понимаю основную причину этого сообщения об ошибке:

ConcurrentBag реализует IReadOnlyCollection и ConcurrentDictionary реализуетIReadOnlyDictionary.

Почему происходит сбой приведения?

1 Ответ

0 голосов
/ 17 октября 2018

Вместо этого:

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>>();

Это называется ограничением ковариации.Вот более подробно об этом: в основном, если у вас есть контейнер parent, вы можете поместить в него любой производный класс.Но если у вас есть контейнер для ребенка, то вы не можете поместить в него родительский контейнер.

В Водопаде вода падает сверху вниз.

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

...