Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

277
Vistas
C# Covarianza/Contravarianza en IEnumerable<T> donde T es tipo genérico, interfaz vs clase

¿Alguien entiende por qué tener una restricción genérica donde la clase es diferente a la interfaz? Este código no compila:

 public interface IInterface { } public class Class<T> where T : IInterface { public void Do() { IEnumerable<IInterface> ret = GetEnumerable(); } public IEnumerable<T> GetEnumerable() { return new T[0]; } }

mientras que, al cambiar IInterface a clase, de repente compila

 public class IInterface { } public class Class<T> where T : IInterface { public void Do() { IEnumerable<IInterface> ret = GetEnumerable(); } public IEnumerable<T> GetEnumerable() { return new T[0]; } }

Sé que puedo usar:

 IEnumerable<IInterface> ret = (IEnumerable<IInterface>)GetEnumerable();

pero realmente me gustaría saber la razón por la cual el elenco es necesario si IInterface es una interfaz.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

La verdadera pregunta es, ¿es realmente necesario?

T , en este caso específico, siempre debe ser una clase.

Puede asegurarse de ello agregando adicionalmente la restricción class .

 public interface IInterface { bool Foo { get; set; } } public class Class<T> where T : class, IInterface { public void Do() { var ret = GetEnumerable(); foreach (var item in ret) { item.Foo = true; // you can handle the object just if you would have an object of that type. } } public IEnumerable<T> GetEnumerable() { return new T[0]; } }

Ahora, si elimina la restricción de clase, aún funcionaría. Sin embargo, si pasa el cursor sobre los garabatos de ese item.Foo = true , se hará evidente por qué:

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo Denunciar

0

Como se indica en la documentación :

La variación se aplica solo a los tipos de referencia; si especifica un tipo de valor para un parámetro de tipo variante, ese parámetro de tipo es invariable para el tipo construido resultante.

Con su ejemplo de interfaz, no existe tal restricción en T , mientras que con el ejemplo de clase se infiere esta restricción.

Si necesita restringir a una interfaz, se requiere una "restricción de tipo de referencia" adicional:

 public class Class<T> where T : class, IInterface
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda