La razón es que un List<IJob>
no es un List<Job>
, aunque un Job
implementa IJob
.
Ésta es co- o contra-varianza (. No recuerdo cuál es cuál)
El pensamiento es algo como esto:
El compilador no puede garantizar que AddRange
sólo lee las cosas del parámetro se se da, y por lo tanto no puede garantizar que esto sea seguro, y por lo tanto no compila.
Por ejemplo, a pesar de que el compilador sabe, AddRange podría agregar otro objeto en el parámetro jobs
, que implementa IJob
(porque AddRange espera IJob
colecciones), pero no es Job
, que es lo que jobs
esperar, y por lo tanto que se no estar seguro.
En C# 4.0, hay algo de soporte para manejar esto, pero no estoy seguro de que manejaría su caso particular ya que el soporte debe especificarse en el nivel de interfaz, y no en el nivel de método.
En otras palabras, debería especificar en el tipo de interfaz que todo lo que se relaciona con T solo va a la colección, nunca se sale de ella, y luego el compilador le permite hacer esto. Sin embargo, una colección que no puede leer sería bastante inútil.
Skeet + covarianza/contravarianza en tres ... dos ... uno ... – Will
Funcionará si puede usar C# 4.0 –
Voy a suponer que el comentario '// no se puede compilar' el segundo ejemplo anterior es sobrante del primero? ¿O eso tampoco se puede compilar? –