LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Может, я что-то упускаю, но мне кажется, что инвариантность вообще нет смысла обсуждать - это просто «отсутствие ковариантности и контравариантности» - она доступна по умолчанию сразу, как только возникают параметрические типы. Верно?

Насчёт сигнатуры преобразователя функцией, если бы можно было записать, то он должен быть таким:

void ПреобразоватьКаждыйЭлементФункцией<Ts,Td>(
  IList<Ts U Td> list, 
  Func<Ts in,Td out> mappingFunc
);
Здесь Ts U Td - это объединение типов, т.е. ему удовлетворяет объект, удовлетворяющий хотя бы одному из Ts и Td. В С#, возможно, такого типа не бывает, а в лиспе он бывает.

Соответственно вопрос, что можно сказать о вариантности Ts и Td - в самом ПреобразоватьКаждыйЭлементФункции ?

Исходная версия den73, :

Может, я что-то упускаю, но мне кажется, что инвариантность вообще нет смысла обсуждать - это просто «отсутствие ковариантности и контравариантности» - она доступна по умолчанию сразу, как только возникают параметрические типы. Верно?

Насчёт сигнатуры преобразователя функцией, если бы можно было записать, то он должен быть таким:

void ПреобразоватьКаждыйЭлементФункцией<Ts,Td>(IList<Ts U Td> list, Func<Ts in,Td out> mappingFunc);
Здесь Ts U Td - это объединение типов, т.е. ему удовлетворяет объект, удовлетворяющий хотя бы одному из Ts и Td. В С#, возможно, такого типа не бывает, а в лиспе он бывает.

Соответственно вопрос, что можно сказать о вариантности Ts и Td - в самом ПреобразоватьКаждыйЭлементФункции ?