Многомерный IReadOnlyDictionary, типизированный с использованием интерфейса для внутреннего типа значения
Это немного сложно выразить словами, поэтому я объясню на примере. Следующий код не компилируется:
var data = new[] {
new {Item = "abc", Values = new[] {1,2,3}},
new {Item = "def", Values = new[] {1,2,3}}};
IReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>> target;
target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
data.ToDictionary(
i => i.Item,
v => new ReadOnlyDictionary<Guid, int>(
v.Values.ToDictionary(
a => Guid.NewGuid(),
b => b))));
Я получаю ошибку:
The best overloaded method match for
'ReadOnlyDictionary<string,IReadOnlyDictionary<Guid,int>>
.ReadOnlyDictionary(IDictionary<string,IReadOnlyDictionary<System.Guid,int>>)'
has some invalid arguments
Тем не менее, если я объявляю target, используя класс вместо интерфейса для внутренних значений, он компилируется:
IReadOnlyDictionary<string, ReadOnlyDictionary<Guid, int>> target;
target = new ReadOnlyDictionary<string, ReadOnlyDictionary<Guid, int>>(
data.ToDictionary(
i => i.Item,
v => new ReadOnlyDictionary<Guid, int>(
v.Values.ToDictionary(
a => Guid.NewGuid(),
b => b))));
Почему я не могу использовать интерфейс для внутреннего словаря?
1 ответ
Решение
Вы можете разыграть ReadOnlyDictionary
для IReadOnlyDictionary
:
target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
data.ToDictionary(
i => i.Item,
v => (IReadOnlyDictionary<Guid, int>)new ReadOnlyDictionary<Guid, int>(
v.Values.ToDictionary(
a => Guid.NewGuid(),
b => b))));
Или укажите тип интерфейса в качестве общего аргумента для ToDictionary
:
target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
data.ToDictionary<string, IReadOnlyDictionary<Guid, int>>(
i => i.Item,
v => new ReadOnlyDictionary<Guid, int>(
v.Values.ToDictionary(
a => Guid.NewGuid(),
b => b))));