Начну с того, что я являюсь разработчиком Java для программирования на С#. Поэтому я сравниваю то, что знаю с тем, чему я учусь.
Я играю с генераторами С# в течение нескольких часов, и я смог воспроизвести те же самые вещи, которые я знаю в Java на С#, за исключением нескольких примеров, использующих ковариацию и контравариантность. Книга, которую я читаю, не очень хороша в этом вопросе. Я обязательно буду искать дополнительную информацию в Интернете, но пока я это делаю, возможно, вы можете помочь мне найти реализацию С# для следующего кода Java.
Пример стоит тысячи слов, и я надеялся, что, посмотрев хороший образец кода, я смогу быстрее ассимилировать его.
ковариация
В 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);
Теперь я обнаружил, что С# поддерживает ковариацию/контравариантность только на интерфейсах и до тех пор, пока они явно объявлены для этого (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);
Моя основная проблема, пытаясь реализовать это на С#, заключается в том, что я не мог найти интерфейс, который одновременно был ковариантным и контравариантным, так как это случай List в моем примере выше. Возможно, это может быть сделано с двумя различными интерфейсами в С#.
Любые мысли о том, как реализовать это?
Благодарим всех за любые ответы, которые вы можете внести. Я уверен, что я буду многому научиться из любого примера, который вы можете предоставить.