valor una referencia programacion por pase pasaje parametros funciones enviar comando clase c# generics compiler-construction covariance contravariance

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



pasaje de parametros en c# (2)

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

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

¿Por qué esto es permitido por el compilador si la anotación de varianza no tiene sentido en una situación de este tipo?


¿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 de este tipo?

Está permitido por el compilador porque nunca pensé que alguien podría intentar hacer eso cuando agregué las reglas de varianza al compilador de C # 4.0.

Las advertencias y los errores del compilador son características , y para que una característica se implemente, debe pensarse , en un mínimo, 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:

  • ¿Es el código el tipo de cosa que alguien podría escribir 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.

  • Es el código 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í.

Tendré que pensarlo más, pero a primera vista parece que esto realmente 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!


Está permitido simplemente porque es un código legal. No hay absolutamente ningún daño en eso. Sí, no puede usar la conversión contravariante, pero no veo el problema. Nada en el código en realidad será engañoso u ocultará algunos retorcidos gotcha .

Simplemente creo que el compilador no verifica 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 # supusiera que cualquiera que utilice la varianza de interfaz genérica sabría que hacerlo con tipos de valores no tiene sentido y, en cualquier caso, no tiene efectos secundarios.