C # дженерики - без нижних границ по дизайну?

Я читал интервью с Джошуа Блохом в журнале «Coders at Work», где он посетовал на введение обобщений в Java 5. Ему не очень нравится конкретная реализация, потому что поддержка отклонений - подстановочные знаки Java - делает его излишне сложным.

Насколько я знаю, в C # 3 нет ничего похожего на явные, ограниченные символы подстановки, например Вы не можете объявить метод PriceBatch, который принимает коллекцию активов или любого подкласса активов (void PriceBatch(Collection<? extends Asset> assets) на Яве?).

Кто-нибудь знает, почему подстановочные знаки и границы не были добавлены в C #? Были ли эти функции намеренно упущены, чтобы сделать язык проще, или это то, что они просто еще не удосужились реализовать?

РЕДАКТИРОВАТЬ: Святой дым, комментарии самого Эрика Липперта! Прочитав его проницательные комментарии Пола, я понимаю, что поддерживаются по крайней мере верхние границы и что приведенный выше пример можно перевести на C # как:

void PriceBatch<T>(ICollection<T> assets) where T : Asset

Нижние границы, с другой стороны, явно не поддерживаются, как говорит Эрик во втором комментарии, например вероятно, нет никакого способа напрямую перевести этот (несколько надуманный) код Java в C #:

public class Asset {}
public class Derivative extends Asset {}
public class VanillaOption extends Derivative {}

public static <T extends Asset> void copyAssets(Collection<T> src, Collection<? super T> dst) {
    for(T asset : src) dst.add(asset);
}

Collection<VanillaOption> src = new ArrayList<VanillaOption>();
[...]
Collection<Derivative> dst = new ArrayList<Derivative>();
[...]
copyAssets(src, dst);

Я прав? Если это так, то есть ли конкретная причина, по которой C # имеет верхние, но не нижние границы?

Ответы на вопрос(3)

Ваш ответ на вопрос