c# - 无法将类型 [具体] 隐式转换为 [接口(interface)]

标签 c#

我知道我冒着挨揍的风险,但我觉得我在这件事上要绕圈子。为了让模型可用于多个项目,我们已将模型移出到一个单独的项目(一个 DLL)中,作为一系列要实现的接口(interface)。我们的界面上有这一行:

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; }
    }

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

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

        });

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

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

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

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

但是这样做会在其他接口(interface)的行上产生错误:

List<IImportOrderLineModel> Lines { get; set; }

Using generic type 'IImportsOrderLineModel' requires 1 type arguments

我怎样才能克服这个问题?

最佳答案

接受的答案似乎是正确的,但有更好的方法来解决这个问题。首选解决方案是:

IEnumerable<IImportOrderLineModel> lines = 
  items.Where(x => x.OrderNumber == order.OrderNumber);
order.Lines = lines.ToList();

此解决方案消除了 Renat 回答中解决方案的两个问题:

  • 您以列表开始并以列表结束,因此您需要至少创建一个 新列表。但是FindAll不必要地创建另一个列表。那是额外的工作、额外的收款压力等等,换来的是没有任何好处。
  • Cast<IImportOrderLineModel>操作类似地创建一个新的枚举器,但这是不必要的;你总是可以免费简单地做一个协变引用转换到IEnumerable<IImportOrderLineModel> .

关于c# - 无法将类型 [具体] 隐式转换为 [接口(interface)],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201842/

相关文章:

c# - 如何组织 Windows Phone 代码库以同时针对 7.x 和 8 平台

c# - WP7 游戏的 XNA : DrawUserIndexedPrimitives

c# - 在 Unity 中使用 GetComponent 时通过基类管理派生类?

c# - ASP.NET EntityFramework 获取数据库名称

c# - 使用默认空行填充 DataGridView

C# WinForms : On New Form Load Choose Tab Visibility

c# - 如何在 xamarin 表单中的标签文本上画一条线

c# - 在 WPF/C# 中以编程方式更改边距

c# - 最快的类型比较?

c# - 如何在 visual studio 中重新创建这样的列表?