Je ne comprends pas pourquoi le code C # suivant ne se compile pas.
Comme vous pouvez le voir, j'ai une méthode générique statique Something avec un IEnumerable<T>
paramètre (et T
est contraint d'être une IA
interface), et ce paramètre ne peut pas être converti implicitement en IEnumerable<IA>
.
Quelle est l'explication? (Je ne recherche pas de solution de contournement, juste pour comprendre pourquoi cela ne fonctionne pas).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Erreur que je reçois en Something2(bar)
ligne:
Argument 1: impossible de convertir de «System.Collections.Generic.List» en «System.Collections.Generic.IEnumerable»
T
aux types de référence. Si vous utilisez la condition, where T: class, IA
cela devrait fonctionner. La réponse liée a plus de détails.
Something2(foo);
directement. Il n'est pas nécessaire de faire le tour .ToList()
pour obtenir un List<T>
( T
votre paramètre de type est-il déclaré par la méthode générique) pour comprendre cela (a List<T>
est un IEnumerable<T>
).