首页 > 解决方案 > 无法将类型 [具体] 隐式转换为 [接口]

问题描述

我知道我冒着被撞的风险,但我觉得我在这个问题上绕圈子。为了使模型可用于多个项目,我们已将模型移到单独的项目(DLL)中,作为一系列接口来实现。在我们的界面上有这一行:

List<IImportOrderLineModel> Lines { get; set; }

哪个链接到这个界面:

 public interface IImportOrderLineModel
    {
        string OrderNumber { get; set; }
        int? LineNumber { get; set; }
        string ItemId { get; set; }
        string CustomerItemId { get; set; }
        double? Quantity { get; set; }
        decimal? Price { get; set; }
        int? QuantityBackOrdered { get; set; }
        string Comments { get; set; }
        string PickLocation { get; set; }
        string OrderFilled { get; set; }
        string HostUom { get; set; }
        string Type { get; set; }
    }

所以在代码中,当我实现接口并设置属性时,我可以毫无问题地设置它们。我已经创建了两个接口的具体实现并相应地填充了它们。现在我正在尝试这样做:

 Parallel.ForEach(orders, order =>
        {
            order.Lines = items.FindAll(x => x.OrderNumber == order.OrderNumber).ToList();

        });

为了将所有项目组合到订单的相应 Lines 属性中。现在,当模型包含在代码中时,这段代码运行良好,但现在当我们将它们作为接口移出并在具体方法中实现它们时,它就坏了。错误是:

Cannot implicitly convert type 'System.Collection.Generic.List<ImportOrderLineModel>' to 'System.Collections.Generic.List<IImportOrderLineModel>'

我读过关于协方差和苹果不是其他地方给出的水果答案,但这对我来说是一个新的答案。我尝试在界面上使用以下内容:

 public interface IImportOrderLineModel<out ImportOrderLineModel> where ImportOrderLineModel : class, IImportOrderModel

但是这样做会在另一个界面的线上产生错误:

List<IImportOrderLineModel> Lines { get; set; }

使用泛型类型“IImportsOrderLineModel”需要 1 个类型参数

我怎样才能克服这个?

标签: c#

解决方案


看起来这可能有效:

order.Lines = items.FindAll(x => x.OrderNumber == order.OrderNumber)
                   .Cast<IImportOrderLineModel>()
                   .ToList();

推荐阅读