2013-01-11 14 views
5

私のC#のスキルが低いですが、次のように失敗した理由を私は理解できません。次のようにC#のジェネリック医薬品とのインターフェイスとシンプルなOO

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を実装しているので、順序のリストはquoatablesのIListとして入ります。私はJavaのようなものを持っていて、うまく動作するので、私はC#の知識が不足していると確信しています。

答えて

12

:を通じて、(あなたは、その機能が必要な場合)のリストを実体、その後

public void GetQuotes(IEnumerable<IQuotable> quotes) 

あなたはGetQuotesへの署名を変更することができますIList<IQuotable>に転送します。彼らはちょうど互換性がありません。結局のところ、(またはサブタイプ)をList<Order>に追加できるのは、IQuotableのいずれかの種類をIList<IQuotable>に追加することができます。

の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()); 
    
+0

ありがとうございました!私の考えは常にIListの具体的な実装です。オーダーは同じですが(もちろんIQuotablesはもっと多いかもしれません)、IQuotableを使ってIListを実装している限り、メソッドに何かを渡すことができますが、明らかにそうではないので、共分散を読まなければなりません。 net 2これは.NET 2だけをとるCLRストアドプロシージャなので、結局は2番目の例を使用しました。これは意味があり、必要なものを正確に実行しています。 – Daniil

9

IListは共変異体ではない。 List<Order>IList<Quotable>にキャストすることはできません。あなたはList<Order>から変換することはできません

var list = quotes.ToList(); 
関連する問題