2009-07-16 6 views
1

インタフェースのジェネリック型と同じで、コンパイラの警告が発生します。IRepositoryインターフェース

私の質問は次のとおりです。Loadメソッドは実際には汎用であることを意図していたのですか、それとも間違いでしたか?メソッドが汎用であることが意図されていた場合、コンパイラを幸せにするために型名を "T"から "E"のようなものに変更する必要がありますか?

答えて

1

彼らが異なることになっていない - あなたがそこに定義を削除することができるように負荷がレポ取引「タイプ」に取り組むことになっている(私はそれはあなたがやっているものだと仮定)

+0

なぜ宣言は自分の制約を追加するのですか? –

+0

OK、私はそれに応じてコードを修正しました。コンパイラのエラーが発生しました。他のいくつかを修正しなければなりませんでした。プロジェクトをコンパイルするためのファイル。すぐに変更を提出して、正しいことをしているかどうかを確認できます。 –

0

彼らはクラスレベルTと違って制約があるので、彼らは異なっているはずです。

+0

ヒントをお寄せいただきありがとうございます。これは別の質問をもたらします: 私が署名を boolに変更した場合(...)ここでE:class、new(); 次にパラメータは何ですか?彼らは ブールロード(E項目、式(機能>式)または BOOLロード(T項目、式(機能>式)または どちらも上記のだろう –

+0

@Weiマ - ?申し訳ありませんが、」することができます –

0

は次のように私には見えますclassnewの制約は、メソッドレベルではなく、クラスレベルにする必要があります。 IRepository<int>Load<string>を持つことは私にはかなり奇妙に思える

IRepository<int> intRepository = new RepositoryImpl<int>(); 

object o; 
intRepository.Load<string>(o, "column", "value"); 

: -

はそうでない場合は、ええ、あなたはちょうど私がこれを行う可能性があるため、地獄のようにただ混乱して2つの異なるT制約を定義しました。

それはTのみLoad方法ではなく、他人のためにclassnewでなければならない可能です。しかし、その結果を生成するために私は考えることができる最も近い制約です - TClassTからをちょうど継承する可能性があるため、正確に同じではありません

interface IRepository<T> { 
    IQueryable<T> GetAll(); 
    bool Load<TClass>(TClass item, string column, object value) where TClass : class, T, new(); 
} 

:その場合は、次のようなものがよいでしょう。

関連する問題