【问题标题】:Benefit of covariant interfaces vs. methods with generic parameters协变接口与具有泛型参数的方法的优势
【发布时间】: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&lt;BaseType&gt; 数据结构和类似方法 Foo&lt;BaseType&gt;(..) 的好处是“当需要将某些内部部分具有继承关系的事物保持在一起时”,例如 Key-Value-成对?

【问题讨论】:

  • 你应该在这里看看这篇文章:stackoverflow.com/questions/2719954/…
  • 您可能会被否决,因为这个问题可能被解释为主要基于意见,而不是能够用客观正确的答案来回答。 “协变接口能提供什么泛型参数不能提供?”但是,可以客观地回答。

标签: c# covariance


【解决方案1】:

我认为这是一个非常有趣的问题。您基本上是在询问一个示例,其中 (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&lt;string, Animal&gt;

【讨论】:

  • 我根据您的输入扩展了我的问题,以便希望更接近中心点。我知道,只要我不将键和值分成两个单独的参数,字典就不可能写出您所写的内容。
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2017-07-08
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多