我是一名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一样。也许可以用两个不同的接口来实现。
你有什么想法如何实现这个问题吗?
非常感谢大家为我提供任何答案。我相信我会从你们提供的任何示例中学到很多东西。