¿Por qué esto es permitido por el compilador ya que la anotación de la varianza no tiene ningún sentido en una situación como esta?
Está permitido por el compilador porque nunca pensé que alguien podría intentar hacer eso cuando agregué las reglas de varianza al compilador C# 4.0.
advertencias y errores del compilador son características, y con el fin de una función a implementar, se tiene que, en un mínimo, ser idea de en algún momento antes de enviar su compilador. No lo hice y, por lo tanto, nunca tuve la oportunidad de debatir siquiera si debería haber una advertencia para tal situación.
Ahora que me ha llamado la atención, la pregunta es: ¿debería ser una característica? ¿Debería el compilador producir una advertencia (o error) para este caso?
Esa es una llamada de juicio. Varias cosas que consideraríamos son:
¿El código es el tipo de cosa que alguien podría tipear pensando que hace algo sensato? Uno espera no; uno espera que el desarrollador que sabe lo suficiente sobre el sistema de tipos para hacer una variante de interfaz también sepa que la varianza solo funciona en los tipos de referencia. Pero tal vez haya desarrolladores por ahí que puedan escribir esto al pensar que funcionará. No parece más allá de plausibilidad al menos. No está claramente ideado.
¿El código es claramente incorrecto? Sí, probablemente sí. Parece muy poco probable que alguien quiera deliberadamente escribir una interfaz que parezca variante, pero que de hecho no lo es.
Y así sucesivamente.
Tendré que pensarlo más, pero a primera vista parece que esta podría ser una advertencia decente para agregar al compilador. Lo discutiré con el equipo y consideraremos agregarlo a la versión de Roslyn.
¡Gracias por la idea!
¿Lo permite el compilador sin la interfaz? Recuerde que las interfaces son tipos de referencia, y cuando tiene una referencia a una estructura (como una interfaz) se encasilla automáticamente ... – MattDavey
@MattDavey, sin restricción de interfaz también compila bien. Las conversiones covariantes/contravariantes requieren una representación uniforme de los tipos de origen y destino, y 'IFoo' y 'IFoo ' se representan de manera diferente, por lo que no existe conversión. –
ControlFlow
Ok, disculpe la estúpida pregunta, pero ¿alguien puede explicarme por qué en el código anterior la anotación de varianza no tiene sentido? – Tudor