Преобразование родового словаря <> в проблему ICollection <> - PullRequest
0 голосов
/ 04 декабря 2009

Вот пример ситуации:

public class ScheduleArea : IArea<Schedule>
{
//....
private Dictionary<int, ScheduleArea> subArea;
//.... 

#region IArea<Schedule> Members

public ICollection<KeyValuePair<int, IArea<Schedule>>> SubArea
{
     get {
        return (Collection<KeyValuePair<int, IArea<Schedule>>>)this.subArea;//Error here
     }

}

#endregion

subArea содержит ScheduleArea, которая фактически является IArea. Почему конвертация не работает и как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Это не работает, потому что вы предполагаете общее отклонение, которое не работает вообще до .NET 4.0.

Простейшим способом продвижения вперед будет сделать это вручную (учитывая тег "c # 2.0", который, я полагаю, вы не можете использовать LINQ):

List<KeyValuePair<int, IArea<Schedule>>> list = new
    List<KeyValuePair<int, IArea<Schedule>>>(subArea.Count);
foreach (KeyValuePair<int, ScheduleArea> pair in subArea)
{
    list.Add(new KeyValuePair<int, IArea<Schedule>>(pair.Key, pair.Value);
}
return list;

Я бы сделал это методом, а не свойством, учитывая количество копий.

1 голос
/ 04 декабря 2009

Вы столкнулись с очень популярной проблемой общего ко / противо-дисперсии. Вы в основном пытаетесь разыграть Dictionary<int, ScheduleArea> до Dictionary<int, IArea<Schedule>>. Дженерики в .NET не могут быть назначены таким образом

Однако, вы могли бы привести его к IDictionary<int, ScheduleArea> или ICollection<KeyValuePair<int, ScheduleArea>>. Чтобы получить ICollection<KeyValuePair<int, IArea<Schedule>>, вам нужно либо изменить тип переменной subArea, либо создать новый словарь:

Dictionary<int, IArea<Schedule>> dict = new Dictionary<int, IArea<Schedule>>(subArea.Count);

foreach (KeyValuePair<int, ScheduleArea> kvp in subArea) 
{
    dict.Add(kvp.Key, kvp.Value);
}

return dict;

Кроме того, Dictionary не наследуется от Collection - вам нужно использовать ICollection вместо

0 голосов
/ 04 декабря 2009

Ах, ежедневный вопрос о ковариации.

См .: Почему я не могу передать List в качестве параметра методу, принимающему List ?

и

Преобразование списка в список

Подводя итог: каждый элемент должен быть преобразован в новую KeyValuePair для новой коллекции.

...