3

私は次のクラス構造を持っています:

public class A : AInterface { }
public interface AInterface { }

public class B<T> : BInterface<T> where T : AInterface 
{
    public T Element { get; set; }
}
public interface BInterface<T> where T : AInterface 
{
    T Element { get; set; }
}

public class Y : B<A> { }

public class Z<T> where T : BInterface<AInterface> {}

public class Test
{
    public Test()
    {
        Z<Y> z = new Z<Y>();
    }
}

これにより、C#4.0で次のコンパイルエラーが発生します。タイプ「Test.Y」は、ジェネリック型またはメソッド「Test.Z」のタイプパラメーター「T」として使用できません。'Test.Y'から'Test.BInterface'への暗黙の参照変換はありません。

ジェネリックスの共分散はこれを機能させるはずですが?どんな助けでもありがたいです。

4

2 に答える 2

4

インターフェイスのジェネリックパラメータはデフォルトで不変です。特定のジェネリックパラメータを共変にするか反変にするかを明示的に指定する必要があります。基本的に、あなたの例では、インターフェース宣言に「out」キーワードを追加する必要があります。

public interface BInterface<out T> where T : AInterface { } 

バリアントインターフェイスの作成の詳細については、MSDN:バリアントジェネリックインターフェイスの作成(C#およびVisual Basic)を参照してください。

于 2009-12-29T18:32:16.637 に答える
1

キーワードが足りないと思います。out次の行に追加してみてください。

public interface BInterface<out T> where T : AInterface { }
public class Z<out T> where T : BInterface<AInterface> {}

ただし、両方の場所で必要かどうかはわかりません。

于 2009-12-29T04:21:19.847 に答える