首先我要说的是,我是一名正在学习 C# 编程的 Java 开发人员。因此,我会将我所知道的与我正在学习的进行比较。
我已经使用 C# 泛型几个小时了,我已经能够在 C# 中重现我在 Java 中知道的相同内容,除了几个使用协变和逆变的示例。我正在读的书在这个主题上不是很好。我当然会在网上寻找更多信息,但在我这样做的同时,也许您可以帮助我找到以下 Java 代码的 C# 实现。
一个例子抵得上一千个字,我希望通过查看一个好的代码示例我能够更快地理解它。
协方差
在Java中我可以做这样的事情:
public static double sum(List<? extends Number> numbers) {
double summation = 0.0;
for(Number number : numbers){
summation += number.doubleValue();
}
return summation;
}
我可以按如下方式使用此代码:
List<Integer> myInts = asList(1,2,3,4,5);
List<Double> myDoubles = asList(3.14, 5.5, 78.9);
List<Long> myLongs = asList(1L, 2L, 3L);
double result = 0.0;
result = sum(myInts);
result = sum(myDoubles)
result = sum(myLongs);
现在我确实发现 C# 仅在接口上支持协变/逆变,只要它们已明确声明这样做(out/in)即可。我认为我无法重现这种情况,因为我找不到所有数字的共同祖先,但我相信如果存在共同祖先,我可以使用 IEnumerable 来实现这样的事情。由于 IEnumerable 是协变类型。正确的?
关于如何实施上面的列表有什么想法吗?只要指出我正确的方向即可。所有数字类型是否有共同的祖先?
逆变
我尝试的逆变示例如下。在 Java 中,我可以这样做将一个列表复制到另一个列表中。
public static void copy(List<? extends Number> source, List<? super Number> destiny){
for(Number number : source) {
destiny.add(number);
}
}
然后我可以将它与逆变类型一起使用,如下所示:
List<Object> anything = new ArrayList<Object>();
List<Integer> myInts = asList(1,2,3,4,5);
copy(myInts, anything);
我尝试在 C# 中实现这一点的基本问题是,我无法找到同时协变和逆变的接口,就像上面示例中的 List 的情况一样。也许可以用 C# 中的两个不同的接口来完成。
关于如何实施这个有什么想法吗?
非常感谢大家提供的任何答案。我很确定我会从您提供的任何示例中学到很多东西。