C # -Generika - ohne Untergrenzen durch Design?

Ich habe ein Interview mit Joshua Bloch in Coders at Work gelesen, in dem er die Einführung von Generika in Java 5 beklagte. Er mag die spezifische Implementierung nicht besonders, da die Varianzunterstützung - Javas Wildcards - sie unnötig komplex macht.

Soweit ich weiß, hat C # 3 keine expliziten, begrenzten Platzhalter, z. Sie können keine Methode PriceBatch deklarieren, die eine Sammlung von Asset oder einer Asset-Unterklasse annimmt (void PriceBatch(Collection<? extends Asset> assets) in Java?).

Weiß jemand, warum Wildcards und Grenzen nicht zu C # hinzugefügt wurden? Wurden diese Funktionen absichtlich weggelassen, um die Sprache zu vereinfachen, oder ist dies etwas, was sie bisher noch nicht implementiert haben?

BEARBEITEN: Heiliger Rauch, kommentiert von Eric Lippert selbst! Nachdem ich seine und Pauls aufschlussreichen Kommentare gelesen habe, stelle ich fest, dass zumindest obere Schranken unterstützt werden und dass das obige Beispiel in C # übersetzt werden kann als:

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

Untere Schranken werden dagegen anscheinend nicht unterstützt, wie Eric in seinem zweiten Kommentar sagt, z. Es gibt wahrscheinlich keine Möglichkeit, diesen (etwas erfundenen) Java-Code direkt in C # zu übersetzen:

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);

Hab ich recht? Wenn dies der Fall ist, gibt es einen bestimmten Grund, warum C # obere, aber keine unteren Schranken hat?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage