2016-10-16 25 views
0

クラスのすべてのインターフェイスを含み、クラスを含まないdllファイルを作成する必要があります。私はクラスの多くのために、これらのインタフェースを使用しているため それはそのようにする必要があります。インターフェイスでのインターフェイスプロパティの実装

public interface IClassA 
{ 
    string Word { get; } 
} 

public interface ITest<TClassA> where TClassA : IClassA 
{ 
    TClassA A { get; } 
} 

これらのインタフェース私が望むように実装して、二つのクラスの例:

public class ClassA : IClassA 
{ 
    public string Word 
    { 
     get; 
     private set; 
    } 

    public string Sentence 
    { 
     get; 
     private set; 
    } 

    public ClassA(string word, string sentence) 
    { 
     this.Word = word; 
     this.Sentence = sentence; 
    } 
} 

public class Test : ITest<ClassA> 
{ 
    public ClassA A 
    { 
     get; 
     private set; 
    } 

    public Test(ClassA a) 
    { 
     this.A = a; 
    } 
} 

をそして、私は何かをしたいです

public static void Main(string[] args) 
{ 
    ClassA a = new ClassA("hey", "hey world!"); 
    Test t = new Test(a); 

    Print((ITest<IClassA>)t);   
} 

public static void Print(ITest<IClassA> t) 
{ 
    Console.WriteLine(t.A.Word); 
} 

しかし、このキャスト:メインプログラムのそのよう(ITest<IClassA>)t実行時エラーになります。 どうすれば解決できますか?感謝! ありがとう!

答えて

2

あなたはTest

として
public class Test : ITest<IClassA> 

の代わりITest<ClassA>を宣言する必要があります。

またはTClassAに共変するITest<TClassA>を宣言する:

public interface ITest<out TClassA> where TClassA : IClassA 
1

Test級は(public class Test : ITest<ClassA>ClassAコンクリートを実現します。

したがって、明らかに失敗するITest<ClassA>ITest<IClassA>にキャストしようとしています。

あなたはTestが-classキャストが作品、IClassAを実装してみましょう場合:

public class Test : ITest<IClassA> 
{ 
    public IClassA A 
    { 
     get; private set; 
    } 

    public Test(IClassA a) 
    { 
     this.A = a; 
    } 
} 
+0

私はテストクラスがにClassAとないIClassAの性質を持つようにしたい、それは可能ではないのか? – Gal1014

+0

はい、そうです。 @IThomasの[回答](http://stackoverflow.com/a/40069043/594832)を見てください: 'ITest 'が共変な場合は、可能です:https://dotnetfiddle.net/KKkktG – khlr

関連する問題