Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

276
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!