2009-12-04 4 views
0

Вот это Exemple ситуации:Преобразование Generic Dictionnary <> к задаче ICollection <>

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 

ПОДРАЙОНЕ является содержащий ScheduleArea, который на самом деле является IArea. Почему преобразование не работает и как я могу его исправить?

ответ

1

Это Безразлично» t, потому что вы принимаете общую дисперсию, которая не работает вообще до .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; 

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

+0

Jon: Маленький nitpick: 'Словарь ' действительно реализует 'ICollection >'. – LukeH

+0

http://bit.ly/6NMnTV вот доказательство того, что Словарь действительно реализует ICollection > –

+0

, но не 'Collection >' – thecoop

1

Вы столкнулись с очень популярной проблемой общего совместного/противоречия. Вы в основном пытаетесь нарисовать 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 вместо

+1

C# 2 - не существует var. Я бы также предположил, что если больше нет необходимости в хэшировании, я бы просто пошел со списком вместо словаря для новой коллекции. –

+0

Ах, нет вар. Отредактировано ... – thecoop

Смежные вопросы