J'ai une interface définie comme ci-dessous: et deux classes LINQ-TO-SQL implémentant cette interface: p> i Avoir des listes iEnumérables A et B remplies par les enregistrements de base de données de Tblattesta et TblTestB P> Toutefois, ce qui suit n'est pas autorisé: p> foreach(tblTestA item in a)
list.Add(item)
foreach(tblTestB item in b)
list.Add(item)
4 Réponses :
Vous ne faites rien de mal: Votre Liste iEnumerable iEnumerable iEnumerable foreach code> BOOPS. Sinon, vous pouvez utiliser couler code> pour modifier les types: p>
A code> et B code> est de type iEnumerable ienumerable
Tandis que list.addrange code> nécessite le paramètre de type ienumerable
Eh bien, ils ont besoin que l'argument soit convertible i> à ienumerable
Je suppose que vous avez raison - je ne connais pas le C # 4, merci :)
Cela fonctionne dans C # 4, en raison de Covariance générique em>. Contrairement aux versions précédentes de C #, il existe une conversion de La fonctionnalité est dans le CLR de V2, mais elle n'a été exposée que dans le C # 4 (et les types de cadre ne l'ont pas profité avant .net 4 soit). Il seul em> s'applique aux interfaces génériques et aux délégués (non classes) et uniquement pour les types de référence (il n'y a donc pas de conversion de Contraviarariance générique est également pris en charge, travaillant dans l'autre sens - vous pouvez donc convertir de Si vous n'utilisez pas C # 4, la suggestion de TIM d'utiliser Si vous voulez en savoir plus sur la variance générique, Eric Lippert a un Longues séries de blog postes à ce sujet , et j'ai donné une discussion à ce sujet à NDC 2010 que vous pouvez regarder sur le page vidéo NDC . p> ienumerable ienumerable ienumerable ienumerable iEnumerable iliste icomparer icomparer énumérable.Cast
L'Addrange s'attend à une liste d'objets d'interface, et vos varaibles "A" et "B" sont définies comme une liste d'objets de classe dérivés. De toute évidence, il semble raisonnable que .NET puisse logiquement que le saut et les traiter comme des listes d'objets d'interface car ils mettent en œuvre l'interface, cette logique n'était tout simplement pas intégrée à. Net allant jusqu'à 3.5. P>
Cependant, cette capacité (appelée "covariance") a été ajoutée à .NET 4.0, mais jusqu'à ce que vous mettriez la mise à niveau avec une boucle, ou peut-être essayez d'appeler TOARRAY (), puis de lancer le résultat à un TaskInterface [], ou peut-être une requête LINQ pour casse à chaque élément et créer une nouvelle liste, etc. p>