【问题标题】:How can I return List<MyInterface> in this scenario在这种情况下如何返回 List<MyInterface>
【发布时间】:2009-07-31 00:37:25
【问题描述】:

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

我正在编写一个方法 (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
    {
    ...
    }

当一个方法返回一个接口时,你只返回一个实现该接口的对象。正确的?我做错了什么?

【问题讨论】:

  • 见 Daniel White 的回答。在 .NET 4 中应该支持这一点(类型协方差)

标签: c# .net interface


【解决方案1】:
var claimReportRows = new List<IClaimDetail>();

只要改变这个。然后您仍然可以将DentalClaimDetail 插入其中。

【讨论】:

  • @asp316 - 不要在不了解为什么需要这样做的情况下更改代码。从第 1 部分开始阅读 Eric Lippert 关于协变和逆变的系列 (blogs.msdn.com/ericlippert/archive/...),它解释了为什么您可能认为您的代码应该工作,直到第 11 部分,这将解释为什么它不t,但是为什么在 C# 4.0 中会有类似的事情。
  • 这篇文章是好东西。让我的大脑受伤,但真的会对这里发生的事情有所了解。谢谢格雷格! ——
【解决方案2】:

泛型实际上会在编译时为每个泛型参数即时生成一个类型,因此 List 是一种类型,而 List 实际上是另一种类型,因此您会收到编译器错误。

是的,蹩脚的,但只是按照 Daniel A. White 的描述改变你的电话

var claimReportRows = new List<IClaimDetail>();

(尽管您应该能够直接使用该类型,除非您使用的是 Linq)然后让代码使用强制转换将 DentalClaimDetail 转换为 IlaimDetail 应该可以解决问题。 如果不使用 Linq,您可以执行以下操作:

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多