2009-07-31 24 views
1

讓我首先說我對使用接口很新穎。如何在此場景中返回列表<MyInterface>

我在寫一個方法(GetClaimDetails),它將返回有關醫療保險索賠的信息。如果是聲明類型A,它將返回ClaimDetailA類的列表。如果聲明類型B,ClaimDetailB類的返回列表。這兩個類都共享公共屬性,但每個都有獨特的屬性。通用屬性在界面中實現。

我提取了一個名爲IClaimDetail的接口並設置了兩個接口來實現它。當我設置方法返回IClaimDetail並讓它返回實現IClaimsDetail的對象的實例時,我得到編譯器消息

'不能隱式地將類型'System.Collections.Generic.List DentalClaimDetail'轉換爲'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 
    { 
    ... 
    } 

當一個方法返回一個接口,你只返回一個對象實現接口。正確?我究竟做錯了什麼?

+0

查看Daniel White的回答。在.NET 4中,應該支持(類型協方差) – Jimmy 2009-07-31 00:41:53

回答

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

只要改變這一點。然後你將能夠插入DentalClaimDetail仍然。

+0

哇。很容易。謝謝!! – 2009-07-31 00:42:03

+1

@ asp316 - 不要只是改變你的代碼而不理解爲什麼你需要這樣做。閱讀Eric Lippert關於協變和逆變的系列(blogs.msdn.com/ericlippert/archive/...),從第1部分開始,這解釋了爲什麼您可能認爲您的代碼應該工作,直到第11部分,這將解釋爲什麼它不會「 t,但爲什麼類似的東西會在C#4.0中。 – 2009-07-31 00:49:19

+0

對不起,實際鏈接:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx – 2009-07-31 00:51:11

1

泛型實際生成的即時編譯時,每一般的參數的類型,因此名單<IClaimDetail>是一種類型,並列出<DentalClaimDetail>實際上是另一種類型,所以您將獲得該編譯器錯誤。

是的,瘸腿的,但簡單地改變你的電話由Daniel A.懷特所概述

var claimReportRows = new List<IClaimDetail>(); 

(雖然你應該能夠直接使用,除非你正在使用LINQ的類型),然後有代碼使用cast來將DentalClaimDetail強制轉換爲IClaimDetail應該可以做到。 如果不使用LINQ,你可以這樣做:

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

希望這有助於!