Der Grund ist, dass ein List<IJob>
kein List<Job>
ist, obwohl ein Job
IJob
implementiert.
Dies ist Co- oder contra-Varianz (. Ich erinnere mich noch nie, was was ist)
Das Denken geht in etwa so:
Der Compiler kann nicht garantieren, dass AddRange
liest nur Dinge aus dem Parameter es ist gegeben, und so kann es nicht garantieren, dass dies sicher ist, und daher kompiliert es nicht.
Zum Beispiel für alle Compiler weiß, AddRange könnte ein anderes Objekt in den jobs
Parameter hinzuzufügen, dass implementiert IJob
(weil AddRange IJob
Sammlungen erwartet), ist aber nicht Job
, was was ist jobs
zu erwarten, und damit das würde nicht sicher sein.
In C# 4.0 gibt es einige Unterstützung für die Handhabung, aber ich bin mir nicht sicher, es würde Ihren speziellen Fall behandeln, da die Unterstützung auf der Schnittstellenebene und nicht auf der Methodenebene angegeben werden muss.
Mit anderen Worten, Sie müssten auf dem Interface-Typ angeben, dass alles, was zu T in Beziehung steht, nur in die Sammlung geht, niemals daraus, und dann würde der Compiler dies ermöglichen. Eine Sammlung, von der Sie nicht lesen können, wäre jedoch ziemlich sinnlos.
Skeet + Kovarianz/Kontravarianz in drei ... zwei ... eins ... – Will
Funktioniert, wenn Sie in der Lage sind, C# 4.0 zu verwenden –
Ich gehe davon aus, dass der '// nicht Kompilieren' Kommentar in das zweite Beispiel ist von der ersten übrig? Oder kann das auch nicht kompiliert werden? –