2013-01-24 7 views
7

私は、次の(C#.NET4)のようなインタフェースのスキーマを持っているネストされた汎用的なインタフェース

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> b; 
} 

と私はこの方法でそれを実装:

public interface A 
{ 

} 

public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 

public interface C<T> where T : B 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

私は回避する方法がわかりませんエラージェネリック型 'B'を使用するには1つの型引数が必要です

+1

あなたはインターフェイスを実装していません... – Maarten

+0

私は間違った動詞を使用しました:) ..基本的にすべてのアスワンは良いです、ありがとう – Davide

答えて

7

interface B<T>は一般的なので、正式な引数を指定する必要がありますinterface C<T>と宣言したとき。言い換えれば、現在の問題は、あなたがどのタイプのインタフェースBインタフェースCが "継承する"かをコンパイラに伝えていないということです。

2つのTは必ずしも同じタイプを参照するとは限りません。彼らは

public interface C<T> where T : B<T>, A { ... } 

のように、同じ種類であってもよく、または、彼らは、2つの異なるタイプがあります。

public interface C<T, U> where T : B<U> where U : A { ... } 

型引数の制限はもちろんタイト最初のケースです。

1

Cは一般的な一般的なタイプ(よりよい単語の欠如のため)のように見えます。

このCの定義は代わりに機能しますか?

public interface C<T,U> where T : B<U> where U : A 
{ 
    List<T> b{ get; set; } 
} 
1

インタフェースBにおけるジェネリック型は、あなたがタイプB<A>Tを宣言する必要がCインターフェイスで、タイプAのインスタンスすることができるので:

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface C<T> where T : B<A> 
{ 
    List<T> b { get; set; } 
} 
1

あなたがT<List<T>>を持っているためですあなたがBのタイプを指定する必要があるList<B>として今のところB<T>です。これがエラーの原因です。

public interface C<T, T2> where T : B<T2> 
    where T2 : A 
{ 
    List<T> b { get; set; } 
} 

AにキャストT2、その後、あなたはそれが目的を解決しない

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface BA : B<A> 
{ 
} 
public interface C<T> where T : BA 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

のように、ここでもう一つのインタフェースを追加することができます:)

1

罰金になりますか?

関連する問題