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 を実装するため、注文のリストは quoatable の IList として入力されます。私は Java のようなものを持っていて、それが機能するので、C# の知識が不足していると確信しています。

4

2 に答える 2

12

List<Order>からに変換することはできませんIList<IQuotable>。それらは互換性がありません。結局のところ、任意の種類のIQuotableIList<IQuotable>- に追加できますが、 に追加できるのはOrder(またはサブタイプ)だけList<Order>です。

3 つのオプション:

  • .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は共変ではありません。List<Order>aを an にキャストすることはできませんIList<Quotable>

の署名をGetQuotes次のように変更できます。

public void GetQuotes(IEnumerable<IQuotable> quotes)

次に、次の方法でリストを具体化します (その機能が必要な場合)。

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