12

次のようなインターフェイスのスキーマがあります (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 つの型引数が必要です

4

5 に答える 5

10

はジェネリックであるため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 { ... }

もちろん、型引数の制限は、最初のケースではより厳しくなります。

于 2013-01-24T09:28:36.190 に答える
1

C はジェネリック ジェネリック型のように見えます (より適切な言葉がないため)。

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

public interface C<T,U> where T : B<U> where U : A
{
    List<T> b{ get; set; } 
}
于 2013-01-24T09:30:05.437 に答える
1

インターフェイスのジェネリック型はBtype のインスタンスにしかできないため、Aインターフェイスでは typeCを宣言する必要があります。TB<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; } 
}
于 2013-01-24T09:30:55.413 に答える
1

これは、 のタイプを指定する必要がある場所<List<T>>としてTB<T>現時点で があるためです。これがエラーの理由です。List<B>B

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

にキャストT2するAと、問題ありません:)

于 2013-01-24T09:30:59.733 に答える
1

ここにもう1つのインターフェイスを追加できます

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
}

それは目的を解決しますか?

于 2013-01-24T09:33:19.250 に答える