2009-07-31 5 views
1

Laissez-moi commencer par dire que je suis assez nouveau à l'utilisation des interfaces.Comment puis-je retourner Liste <MyInterface> dans ce scénario

J'écris une méthode (GetClaimDetails) qui renverra des informations sur une réclamation d'assurance médicale. S'il s'agit du type de revendication A, il renvoie une liste de la classe ClaimDetailA. Si le type de réclamation B, renvoie la liste de la classe ClaimDetailB. Ces deux classes partagent des propriétés communes, mais chacune possède des propriétés uniques. Les propriétés communes sont implémentées dans une interface.

J'ai extrait une interface nommée IClaimDetail et défini les deux pour l'implémenter. Lorsque je mets la méthode pour retourner IClaimDetail et qu'elle renvoie une instance d'un objet qui implémente IClaimsDetail, j'obtiens le message du compilateur

'Impossible de convertir implicitement' System.Collections.Generic.List DentalClaimDetail 'en' System.Collections .Generic.List IClaimDetail »

private static List<IClaimDetail> GetClaimDetailsB(string claimNumber, string connectionStringName) 
     { 

      var claimReportRows = new List<DentalClaimDetail>(); 
     ..removed for brevity 
     return claimReportRows; 
    } 



    public class DentalClaimDetail : IClaimDetail 
    { 
    ... 
    } 

Lorsqu'une méthode retourne une interface, vous revenez juste un objet, les outils de l'interface. Correct? Qu'est-ce que je fais mal?

+0

Voir la réponse de Daniel White. En .NET 4 ceci devrait être supporté (type covariance) – Jimmy

Répondre

7
var claimReportRows = new List<IClaimDetail>(); 

Modifiez simplement ceci. Ensuite, vous serez en mesure d'insérer DentalClaimDetail encore.

+0

Wow. assez facile. Merci!! –

+1

@ asp316 - Ne changez pas votre code sans comprendre pourquoi vous devez le faire. Lisez la série d'Eric Lippert sur la covariance et la contravariance (blogs.msdn.com/ericlippert/archive/...) à partir de la partie 1, ce qui explique pourquoi vous pensez probablement que votre code devrait fonctionner, jusqu'à la partie 11, ce qui explique pourquoi il ne fonctionne pas. t, mais pourquoi des choses similaires seront dans C# 4.0. –

+0

Désolé, lien réel: http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx –

1

Generics génèrent en fait un type à la volée au moment de la compilation pour tous les arguments génériques, donc Liste <IClaimDetail> est un type, et la liste <DentalClaimDetail> est en fait un autre type, vous obtiendrez des erreurs du compilateur pour cela.

Oui, boiteux, mais simplement changer votre appel comme indiqué par Daniel A. White

var claimReportRows = new List<IClaimDetail>(); 

(bien que vous devriez juste être en mesure d'utiliser directement le type à moins que vous utilisez LINQ) et ayant le code utiliser cast pour lancer le fichier DentalClaimDetail vers un IClaimDetail devrait faire l'affaire. Sinon LINQ, vous pouvez faire quelque chose comme:

List<IClaimDetail> claimReportRows = new List<IClaimDetail>(); 
//...populate Dentail Claims Here... 
foreach(DentalClaimDetail dcd in dentalClaims) 
{ 
    claimReportRows.Add((IClaimDetail)dcd); 
} 
return claimReportRows. 

Hope this helps!

Questions connexes