转换通用字典<>到ICollection<>问题

时间:2009-12-04 15:59:06

标签: .net generics c#-2.0

以下是情况的例子:

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包含一个实际上是IArea的ScheduleArea。为什么转换不起作用,我该如何解决?

3 个答案:

答案 0 :(得分: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 :(得分:1)

它不起作用,因为你假设了泛型方差,直到.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;

考虑到正在进行的复制,我会把它变成一个方法而不是一个属性。

答案 2 :(得分:0)

啊,关于协方差的日常问题。

请参阅:Why can't I pass List<Customer> as a parameter to a method that accepts List<object>?

Convert List<DerivedClass> to List<BaseClass>

总结一下:每个项目都必须转换为新集合的新KeyValuePair。