Anotación de varianza de C # de un parámetro de tipo, restringido para ser tipo de valor

Es posible en C # agregar una anotación de varianza al parámetro de tipo, restringido a ser de tipo valor:

interface IFoo where T : struct { void Boo(T x); } 

¿Por qué es permitido por el comstackdor si la anotación de varianza no tiene ningún sentido en una situación así?

¿Por qué esto es permitido por el comstackdor ya que la anotación de varianza no tiene ningún sentido en una situación así?

El comstackdor lo permite porque nunca consideré que alguien podría intentar hacerlo cuando agregué las reglas de variación al comstackdor C # 4.0.

Las advertencias y los compiler errors son características , y para que se pueda implementar una característica, debe pensarse , como mínimo, en algún momento antes de enviar su comstackdor . No lo hice y, por lo tanto, nunca tuve la oportunidad de debatir si debería haber una advertencia para tal situación.

Ahora que me lo has señalado, la pregunta es: ¿ debería ser una característica? ¿Debería el comstackdor producir una advertencia (o error) para este caso?

Esa es una decisión de juicio. Una serie de cosas que consideraríamos son:

  • ¿Es el código el tipo de cosa que alguien podría escribir pensando que hace algo sensato? Uno espera que 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 hay desarrolladores que podrían escribir esto pensando que funcionará. No parece más allá de la plausibilidad al menos. No está claramente ideado.

  • ¿Está el código claramente equivocado ? Sí, probablemente lo sea. Parece muy improbable que alguien deliberadamente quiera escribir una interfaz que parezca variante, pero en realidad no lo es.

Y así.

Tendré que pensarlo más, pero a primera vista parece que esto podría ser una advertencia decente para agregar al comstackdor. Lo discutiré con el equipo y consideraremos agregarlo a la versión de Roslyn.

Gracias por la idea!

Se permite simplemente porque es código legal. No hay absolutamente ningún daño en ello. Sí, no puedes usar la conversión contravariante, pero no veo el problema. Nada en el código será realmente engañoso o esconderá algunos errores retorcidos.

Simplemente creo que el comstackdor no comprueba si T es un tipo de valor o un tipo de referencia al verificar la validez de la varianza. Es lógico que el equipo de C # haya asumido que cualquiera que use la varianza genérica de la interfaz sabría que hacerlo con tipos de valor no tiene sentido y, en cualquier caso, no tiene efectos secundarios.