2016-07-01 8 views
1

は、私はインターフェイスBがConcreteAの代わりに、インタフェースAを期待しているので、これはコンパイルされません。これらの二つのインターフェース非ジェネリックContravariance

public interface A 
{ 

} 

public interface B 
{ 
    A a {get;} 
} 

そして、これらの2つの具象タイプ

public class ConcreteA : A 
{ 
} 

public class ConcreteB : B 
{ 
    public ConcreteA a {get;} 
} 

を持っていると言います。

現在、私はインターフェイスでコードを自動生成していますが、このシナリオには遭遇しました。代わりに私のすべてのモデルを実装する明示的なインターフェイス定義を私の具体的なクラスのインターフェイスバージョンを返すように修正する、私は共分散のいくつかのバージョンを使用してこれを行いたいと思いますが、私は方法があるかどうかわからないまたはこれがC#の制限である場合。

  1. 私にこれを可能にする反平行のインターフェースウェイバージョンがありますか?

    1.1これが実装されていない明示的な理由がない場合、またはこれが実装されている場合に問題となるシナリオが存在するかどうかを確認します。あなたはそれが一般的なこの

    B b = new ConcreteB(); 
    b.a = AnythingThatImplementsA; 
    

    があるだけで何かにそれを設定することを強制することはできないためです

    public interface B<T> where T : A 
    { 
        T a {get; set;} 
    } 
    
    public class ConcreteA : A 
    { 
    } 
    
    public class ConcreteB : B<ConcreateA> 
    { 
        public ConcreteA a {get; set;} 
    } 
    

    を動作させるために作る必要があるでしょう

+0

'B b = new ConcreteB();'は、 'ConcreteA'だけでなく' A'を実装するものに 'a'を設定できるのでジェネリックが必要です。 – juharr

+0

@juharrあなたの右のおかげで、私はそれを見過ごしました。あなたはまだインターフェイスを取得していたと仮定することができますが、それは特定のニッチの使用になります –

答えて

2

それ以外の場合はConcreteAです。

+0

あなたの権利私は時間制限が私を許可するときこれを答えとして受け入れます –

関連する問題