2012-03-19 2 views
5

Iている次のインターフェイス宣言:C#でジェネリックを実装するインタフェースパラメータを持つメソッドに2つの同様の具象オブジェクトを渡すにはどうすればよいですか?

interface IOrder<T> where T: IOrderItem 
{ 
    IList<T> Items { get; set; } 
} 

interface IDistro<T> : IOrder<T> where T: IOrderItem 
{ 

} 

私はそうのように、2つの具象クラスを持っている:

public static void UpdateDistro(IDistro<IOrderItem> distro) 
{ 

} 

// DistroItem implements IOrderItem 
public class Distro : IDistro<DistroItem> 
{ 
    public IList<DistroItem> Items { get; set; } 
} 

// PerishableOrderItem implements IOrderItem 
public class PerishableOrder : IDistro<PerishableOrderItem> 
{  
    public IList<PerishableOrderItem> Items { get; set; } 
} 

最後に、私は、データベースに保存するための静的サービスメソッドを持っています

私の問題は、いずれの具体的なタイプのディストリビューションを静的メソッドに渡すにはどうすればいいですか?以下はコンパイルされません:

Distro d = new Distro(); 
UpdateDistro(d); 

をエラーは次のとおりです。

The best overloaded method match for UpdateDistro(IDistro<IOrderItem>)' has some invalid arguments

は答えcontravarianceですか?元のインターフェイス宣言に<in T>を追加しようとしましたが、解決できなかったエラーが追加されました。これは私の最初のインターフェイスへの深い進出であり、ジェネリックスが複雑さを増していると確信しているので、ここでは基本的な理解の欠如があるかもしれません。

答えて

6

あなたはこれを試してみました:

public static void UpdateDistro<T>(IDistro<T> distro) 
    where T : IOrderItem 
{ 
} 

EDIT:

DistroItemPerishableItemクラス(両方IOrderItemを実装する)ための空の実装では、私はエラーなしでコンパイル、次のガット:

Distro d = new Distro(); 
PerishableOrder p = new PerishableOrder(); 

UpdateDistro(d); 
UpdateDistro(p); 
+0

はい、私はそれを試みました。それは 'Distro'オブジェクトを渡すときにまだ不平を言いました。 'UpdateDistro (myDistro)'は同じエラーを投げました。 – IronicMuffin

+0

私はこれがupvotesを得ているのを見る。メソッドを呼び出す適切な方法を私に示すことができるなら、それを答えとしてマークします。 – IronicMuffin

+0

ありがとうございます。申し訳ありませんが痛みです。私はインターフェイスタイプなどにキャストしていた他のテストから残っていました。これは必要に応じて機能します。とても有難い! – IronicMuffin

0

インターフェイスに共変のジェネリックパラメータを定義することができます。インターフェイスを少し変更する必要があります、

public interface IOrder<out T> where T : IOrderItem 
{ 
    IEnumerator<T> Items { get; } 
} 

public interface IDistro<out T> : IOrder<T> where T : IOrderItem 
{ 

} 

coverientパラメータ(out)としてTを定義するには、あなたのバリアントインターフェイスを実装するクラスの暗黙的な変換が可能になります:Tがないことを確認するのにcontravariantly使用しています。

関連する問題