我试图为字典构建一个协变量IEnumerable。
public interface ICovariantKeyValuePair<K, out V>
{
K Key { get; }
V Value { get; }
}因为我只想使用一种方法来处理具有某些公共值类型的不同类型的字典。最后,我非常惊讶地忽略了使用泛型方法的真正简单的解决方案。
public void Print<S,T>(Dictionary<S,T> dict) { ... }现在,我想知道协变接口的真正好处是什么,我们只能使用这些接口,而没有其他方法。
编辑我知道,如果我想将两个值放在一起是有意义的,就像上面描述的协变键-值对一样。Heinzi的以下示例(见下文)
var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);
ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };显然,它只适用于协变量接口。但是为了达到中心点,让我们进一步简化它:我可以写
Dog d = new Dog();
Cat c = new Cat();
List<Animal> l = new List<Animal>() { d, c };在我的数据类型中没有协方差的必要。
因此,在List<BaseType>数据结构和Foo<BaseType>(..)方法上使用协变量接口的好处是,“当需要将某些内部部分的继承关系连接在一起时”,比如键值对的情况?
发布于 2015-12-09 13:54:08
我认为这是一个非常有趣的问题。您基本上是在请求一个示例,其中(1)有一个使用协变量接口的简单解决方案,但是(2)如果您的唯一选择是使方法成为通用的,则没有简单的解决方案。
下面是一个例子:假设我想要一个键值对数组,其中键是一个字符串,值是动物的某个子类型。对于您的协变量类型,我可以执行以下操作:
var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);
ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };这是可能的,因为类型是协变的,也就是说,因为kv1是ICovariantKeyValuePair<string, Animal>。
https://stackoverflow.com/questions/34161597
复制相似问题