【发布时间】:2016-03-13 17:02:33
【问题描述】:
我试图为字典通过构建协变 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>(..) 的好处是“当需要将某些内部部分具有继承关系的事物保持在一起时”,例如 Key-Value-成对?
【问题讨论】:
-
你应该在这里看看这篇文章:stackoverflow.com/questions/2719954/…
-
您可能会被否决,因为这个问题可能被解释为主要基于意见,而不是能够用客观正确的答案来回答。 “协变接口能提供什么泛型参数不能提供?”但是,可以客观地回答。
标签: c# covariance