2

我们在使用泛型时遇到了问题。我们有一个通用键值对的通用集合,其定义如下

public class KeyValueTemplate<K, V> : IGetIdentifier<K>
{
//...
}

public class KeyValueListTemplate<K, V> : ObservableCollection<KeyValueTemplate<K, V>>
{
//....
}

public class KeyValueStringListTemplate : KeyValueListTemplate<string,string> { }

我们在代码中使用它如下

public class test
{

   public KeyValueStringListTemplate SetValuesList{get;set;}
   public ObservableCollection<IGetIdentifier<string>> GetList()
   {
     return SetValuesList;
   }

}

编译器不接受这一点。错误是

Cannot convert type 'KeyValueStringListTemplate' to 'System.Collections.ObjectModel.ObservableCollection<IGetIdentifier<string>>

为什么??这两种类型对我来说都是一样的。

4

2 回答 2

2

这条线

public class KeyValueListTemplate<K, V> : ObservableCollection<KeyValueTemplate<K, V>>

定义了一个新类型,KeyValueListTemplate即 的子类型ObservableCollection,因此它们是不同的类型KeyValueListTemplate可以安全地转换为ObservableCollection,因为它具有ObservableCollection's 功能的超集(根据 Liskov 替换原则),但相反的转换是不安全的。

于 2012-06-29T12:01:37.223 回答
1

它是泛型中的协方差问题,在 .net 4 之前没有暴露给 c#/vb.net。
虽然你可以这样做似乎微不足道:

IEnumerable<string> strings = new List<string>();
// An object that is instantiated with a more derived type argument 
// is assigned to an object instantiated with a less derived type argument. 
// Assignment compatibility is preserved. 
IEnumerable<object> objects = strings;

这是您的代码在底线所做的事情,它不支持.net 4
我链接到的文章解释了如何实现它以及它是如何工作的。

于 2012-06-29T12:13:30.207 回答