2017-01-10 62 views
0

私はwebとstackoverflowを検索し、CS0311エラーを扱う多くの記事を見つけました。シナリオのどれも私に近いものではありません。私はジェネリッククラスから継承するジェネリッククラスを持っています。ジェネリックエラーCS0311を解決するには?

BusinessBaseCSLA枠組み

私は何をしないのです内のクラスであることに注意してください?

public interface Itest 
{ 
    int Digit(); 
} 

class BB : Itest 
{ 
    public int Digit() 
    { 
     return 20; 
    } 
} 


class Test<T> : BusinessBase<T>, Itest where T : Test<T>, Itest 
{ 
    public int Digit() 
    { 
     return 30; 
    } 
} 

Test<Itest> test = new Test<Itest>(); //error CS0311 

エラーCS0311タイプ'MyTestApp.Itest'は、ジェネリック型またはメソッド'A<T>'で型パラメータ'T'として使用することはできません。 'MyTestApp.Itest'から'MyTestApp.A<MyTestApp.Itest>'への暗黙的な参照変換はありません。 MyTestApp

+0

where句に 'Test 'ビットは必要ありません。 'T:Itest'を試してください。 –

+0

ジェネリックで[タイプをタイプパラメータ 'T'として使用することはできませんタイプまたはメソッド - なぜ?](http://stackoverflow.com/questions/24529746/type-cannot-be-used-as-type-parameter-t-in-the-generic-type-or-method-why) – devRicher

+2

は 'Test 'は' Itest'ですが、 'Itest'は' Test 'ではありません。 'Itest'は' BB'かもしれません) –

答えて

1

あなたはこのような何かを行くことができます:

interface Itest {} 

class BusinessBase<T> { 

} 

class Test<T> : BusinessBase<T>, Itest where T : Test<T>, Itest { 
    public int Digit() { 
     return 30; 
    } 
} 

class IT : Test<IT>, Itest { 

} 

class Program { 
    public static int Main() { 

     var t = new Test<IT>(); 
     t.Digit(); 
     return 0; 
    } 
} 

私にはジェネリックの本当にひどい使い道がありますが、それはどのようにしてCSLAは動作します....

+1

ありがとうございます。私はあなたに投票を与えたが、私は新しいユーザーであり、十分な特権を持っていないだろう。一度私はそれを取得します:) – Bill

4

私はコンパイラに同意します。シナリオのTItestです。あなたのwhere条件はITest : Test<ITest> ...しかしITestが明確でない(とすることはできませんが)ないことを必要とするであろう(すぐに容疑者を聞こえる)ことT : Test<T>: Test<ITest>を要求します。

あなたがすることを意図するものは非常に非常に明確ではないが、私はが疑わしいあなたが意味:

class Test<T> where T : Itest 

と:

Test<BB> test = new Test<BB>(); 
+0

私のコードを編集しました。私はCSLAオブジェクトを継承しています。テストにというテストを含まないと、クラス定義エラーが発生します。 – Bill

関連する問題