5

我的 C# 技能很低,但我不明白为什么以下失败:

public interface IQuotable {}
public class Order : IQuotable {}
public class Proxy {
  public void GetQuotes(IList<IQuotable> list) { ... }
}

那么代码如下:

List<Order> orders = new List<Orders>();
orders.Add(new Order());
orders.Add(new Order());

Proxy proxy = new Proxy();
proxy.GetQuotes(orders); // produces compile error

我只是做错了什么而没有看到吗?由于 Order 实现了 Quotable,因此订单列表将作为 IList of quoatables 进入。我有类似 Java 的东西,它可以工作,所以我很确定我缺乏 C# 知识。

4

2 回答 2

12

您无法从 a 转换List<Order>IList<IQuotable>. 他们只是不兼容。毕竟,您可以将任何类型的- 添加IQuotableIList<IQuotable>- 但您只能将Order(或子类型)添加到List<Order>.

三个选项:

  • 如果您使用的是 .NET 4 或更高版本,则可以在将代理方法更改为时使用协方差:

    public void GetQuotes(IEnumerable<IQuotable> list)
    

    当然,这仅在您只需要遍历列表时才有效。

  • 您可以GetQuotes使用约束进行泛型:

    public void GetQuotes<T>(IList<T> list) where T : IQuotable
    
  • 你可以建立一个List<IQuotable>开始:

    List<IQuotable> orders = new List<IQuotable>();
    orders.Add(new Order());
    orders.Add(new Order());
    
于 2013-01-11T16:57:51.197 回答
9

IList不是协变的。您不能将 aList<Order>转换为IList<Quotable>.

您可以将签名更改GetQuotes为:

public void GetQuotes(IEnumerable<IQuotable> quotes)

然后,通过以下方式具体化一个列表(如果您需要它的功能):

var list = quotes.ToList();
于 2013-01-11T16:54:19.467 回答