2011-08-31 12 views
6

ユニットテストプロジェクトでヘルパーメソッドをコーディングすると、プレゼンタがビューインスタンスを初期化してプレゼンタの状態を設定します。型引数は型引数では使用できません

それは私に例外をスロー:

typeパラメータは、型引数を使用することはできません

コード:

public static **TPresenter<TView>** Initialize<TPresenter,TView>() 
    where TPresenter: BasePresenter<TView>, new() 
    where TView : new() 
{ 
} 

を数分後、私は問題がでがわかりました私の帰りのタイプTPresenter<Tview>

私は明確に説明しなかったいくつかの記事を読むT1<T2>

私はプレゼンター割り当てを参照パラメーターを介して行うことを余儀なくされました。説明は歓迎です!

+3

「TPresenter」を返さないのはなぜですか?これは、 'BasePresenter <>'を介して 'TView'に特化させるタイプに既に制約されています。 –

+0

は、発信者側でキャストを避けることを望んでいました!私はT1 を達成できると仮定して!私はPresenterの返品タイプで解決できましたが、T1 がどこに記載されているのか、時間検証をコンパイルするのに役立ちません。 – ioWint

答えて

9

基本的には型パラメータが型パラメータの特定の番号を持つ自体ジェネリック型であることを言っての方法はありません - あなたはTPresenter<TView>メイクセンスを作るために行うことができるようにする必要があります。

参照パラメータを使用して動作させることで意味をはっきりさせることはできません。そのrefパラメータに使用した型はいずれも戻り型として問題ありません。私の推測は、タイプTPresenterであり、TPresenter<TView>ではないということです。

+0

はいそれは出ていましたTPresenter – ioWint

+0

@ioWint:そうです。戻り値の型にしてください。 –

+1

ええ、私はちょうど呼び出し側で明示的なキャストを避けるために考えたことができます。今のところT1 で悩まされることはありません。 – ioWint

1

TPresenter<TView>のようなものは無意味です。 TPresenterは、それが何かになる可能性がある場所に制約されるまで、単なるプレースホルダです。 int<tview>はありません。制約を追加すると、BasePresenter<TView>または派生型である必要があることを意味します。したがって、常にSomething<TView>になります。したがって、TPresenter<TView>は無意味です。

+0

私は0xを誤解させるかもしれませんが、私はTPresenterがBasePresenter であり、TInterfaceがクラスであるという制約を指定します。これは、物事がコンパイル時に大丈夫であることを保証するのに十分ではありませんか? – ioWint

+1

ポイントは制約がTPresenterはBasePresenter またはそれから派生したものでなければならないと言っていますので、戻り値のタイプはTPresenter –

0

これは古いものですが、私もそれを打ちました。クラスの定義では、単一の型を使用し、次に複数の型を使用します。例:

public class Template1<T>{} 

void SomeFunc() 
{ 
    <Template1<SomeClass1,SomeClass2>> someValue = new <Template1<SomeClass1,SomeClass2>>() 
} 

//or even: 
void SomeOtherFunc<U,V>() 
{ 
    <Template1<U,V>> someValue = new <Template1<U,V>>(); 
} 
0

私のコードに似たエラーが発生しました。 @Jon Skeetは正しく正しい方向を指します。戻りタイプは、TPresenter : BasePresenter<TView>で指定されているように、すでに汎用です。だから、TPresenter<TView>の代わりにTPresenterと単純に使うことができます。

public class BasePresenter<T> 
{ 

} 

public class Demo 
{ 
    public static TPresenter Initialize<TPresenter, TView>() where TPresenter: BasePresenter<TView>, new() 
    { 
     return null; 
    } 
} 
関連する問題