以下是情况的例子:
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。为什么转换不起作用,我该如何解决?
答案 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。