代码之家  ›  专栏  ›  技术社区  ›  Bill Martin

在这种情况下,我如何返回list<myinterface>

  •  1
  • Bill Martin  · 技术社区  · 16 年前

    让我先说我对使用接口还很陌生。

    我正在写一个方法(getclaimdetails),它将返回有关医疗保险索赔的信息。如果是索赔类型A,它将返回ClaimDetaila类的列表。如果索赔类型为B,则返回ClaimDetailB类的列表。这两个类共享公共属性,但每个类都有唯一的属性。公共属性在接口中实现。

    我提取了一个名为iclaimdetail的接口,并设置两者来实现它。当我将方法设置为返回iclaimdetail并让它返回实现iclaimdetail的对象的实例时,我会得到编译器消息

    “无法将类型”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
        {
        ...
        }
    

    当方法返回接口时,只返回实现接口的对象。对的?我做错什么了?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Daniel A. White    16 年前
    var claimReportRows = new List<IClaimDetail>();
    

    换一个。然后您就可以插入 DentalClaimDetail 仍然在里面。

        2
  •  1
  •   Tony Heupel    16 年前

    泛型实际上在编译时为每个泛型参数动态生成一个类型,因此list<iclaimdetail>是一种类型,list<dentalclamdetail>实际上是另一种类型,因此您将得到编译器错误。

    是的,跛脚,但只是改变你的电话,正如丹尼尔A.怀特所描述的那样。

    var claimReportRows = new List<IClaimDetail>();
    

    (尽管您应该能够直接使用该类型,除非您使用LINQ),然后让代码使用casting将dentalclamdetail强制转换为iclaimdetail应该可以做到这一点。 如果不使用LINQ,可以执行以下操作:

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

    希望这有帮助!