Из словаря <StudentType, список <Student>> в IDictionary <StudentType, IList <Student>>? - PullRequest
5 голосов
/ 17 мая 2011

Пожалуйста, обратите внимание на следующий код:

class Student
{
}

enum StudentType
{
}

static void foo(IDictionary<StudentType, IList<Student>> students)
{   
}

static void Main(string[] args)
{
    Dictionary<StudentType, List<Student>> studentDict = 
                     new Dictionary<StudentType, List<Student>>();

    foo(studentDict);

    ...
}

Ошибка:

ошибка CS1503: аргумент '1': невозможно преобразовать из 'System.Collections.Generic.Dictionary>' в 'System.Collections.Generic.IDictionary>'

Есть ли способ вызвать функцию foo?

Ответы [ 3 ]

6 голосов
/ 17 мая 2011

Вы можете использовать метод Linq ToDictionary для создания нового словаря, в котором значение имеет правильный тип:

static void Main(string[] args)
{
  Dictionary<StudentType, List<Student>> studentDict = new Dictionary<StudentType, List<Student>>();
  var dicTwo = studentDict.ToDictionary(item => item.Key, item => (IList<Student>)item.Value);
  foo(dicTwo);
}
3 голосов
/ 17 мая 2011

Вам нужно будет создать новый словарь с правильными типами, скопировав данные из старого в новый.

Или вы можете изменить исходный словарь на правильный тип для начала.

В любом случае, нет, вы не можете разыграть словарь.

Причина этого ограничения заключается в следующем:

  1. Словарь содержит значения типа Student
  2. У вас может быть много типов, которые реализуют IStudent
  3. Метод, которому вы даете отлитый словарь, потенциально может попытаться вставить в словарь другого IStudent, даже если это не ученик
0 голосов
/ 17 мая 2011

изменить создание studentDict на:

Dictionary<StudentType, IList<Student>> studentDict = new Dictionary<StudentType, IList<Student>>();
...