C 中的协方差和逆变#
我首先要说的是,我是Java开发人员,正在学习用C#编程。因此,我将我所知道的与我正在学习的东西进行比较。
我已经使用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#中使用两个不同的接口来完成。
关于如何实现这一点的任何想法?
非常感谢大家提供任何可以贡献的答案。我很确定我会从你能提供的任何例子中学到很多东西。