2009-12-04 3 views
0

Voici un exemple de la situation:Conversion générique Dictionnary <> pour problème 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 

est sous-domaine contenant une ScheduleArea qui est en fait une IArea. Pourquoi la conversion ne marche pas et comment puis-je le réparer?

Répondre

1

Il n » t travail parce que vous assumez la variance générique, qui ne fonctionne pas du tout jusqu'à. NET 4.0.

La façon la plus simple est l'avant va être de le faire manuellement (étant donné le « C# 2.0 » tag Je suppose que vous ne pouvez pas utiliser 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; 

Je voudrais faire cette méthode plutôt que une propriété cependant, compte tenu de la quantité de copie en cours.

+0

Jon: Un petit pointeur: 'Dictionnaire ' implémente 'ICollection >'. – LukeH

+0

http://bit.ly/6NMnTV voici la preuve que Dictionary implémente ICollection > –

+0

mais pas 'Collection >' – thecoop

1

Vous rencontrez le problème très populaire de co/contra-variance générique. Essentiellement, vous essayez de transformer un Dictionary<int, ScheduleArea> en un Dictionary<int, IArea<Schedule>>. Génériques dans .NET ne sont pas cessibles comme

Cependant, vous pourrait jeter un IDictionary<int, ScheduleArea> ou ICollection<KeyValuePair<int, ScheduleArea>>. Pour obtenir en fait un ICollection<KeyValuePair<int, IArea<Schedule>> vous devez soit modifier le type de variable subArea ou créer un nouveau dictionnaire:

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; 

En outre, Dictionary ne hérite de Collection - vous devez utiliser à la place ICollection

+1

C# 2 - pas de var disponible. Je suggérerais aussi que s'il n'y a plus besoin de hachage, j'irais simplement avec List au lieu d'un dictionnaire pour la nouvelle collection. –

+0

Ah, pas de var. Edité ... – thecoop

Questions connexes