首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >协变接口与具有泛型参数的方法的优点

协变接口与具有泛型参数的方法的优点
EN

Stack Overflow用户
提问于 2015-12-08 16:55:09
回答 1查看 89关注 0票数 0

我试图为字典构建一个协变量IEnumerable

代码语言:javascript
运行
复制
public interface ICovariantKeyValuePair<K, out V>
{
  K Key { get; }
  V Value { get; }
}

因为我只想使用一种方法来处理具有某些公共值类型的不同类型的字典。最后,我非常惊讶地忽略了使用泛型方法的真正简单的解决方案。

代码语言:javascript
运行
复制
public void Print<S,T>(Dictionary<S,T> dict) { ... }

现在,我想知道协变接口的真正好处是什么,我们只能使用这些接口,而没有其他方法。

编辑我知道,如果我想将两个值放在一起是有意义的,就像上面描述的协变键-值对一样。Heinzi的以下示例(见下文)

代码语言:javascript
运行
复制
var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);
ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };

显然,它只适用于协变量接口。但是为了达到中心点,让我们进一步简化它:我可以写

代码语言:javascript
运行
复制
Dog d = new Dog();
Cat c = new Cat();
List<Animal> l = new List<Animal>() { d, c };

在我的数据类型中没有协方差的必要。

因此,在List<BaseType>数据结构和Foo<BaseType>(..)方法上使用协变量接口的好处是,“当需要将某些内部部分的继承关系连接在一起时”,比如键值对的情况?

EN

回答 1

Stack Overflow用户

发布于 2015-12-09 13:54:08

我认为这是一个非常有趣的问题。您基本上是在请求一个示例,其中(1)有一个使用协变量接口的简单解决方案,但是(2)如果您的唯一选择是使方法成为通用的,则没有简单的解决方案。

下面是一个例子:假设我想要一个键值对数组,其中键是一个字符串,值是动物的某个子类型。对于您的协变量类型,我可以执行以下操作:

代码语言:javascript
运行
复制
var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);

ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };

这是可能的,因为类型是协变的,也就是说,因为kv1ICovariantKeyValuePair<string, Animal>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34161597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档