1

サブソニック 3 のソース コードを読んでいます。ファイル IRepository.cs で、次のものが見つかりました。

public interface IRepository<T>
{
    IQueryable<T> GetAll();
    PagedList<T> GetPaged<TKey>(Func<T, TKey> orderBy, int pageIndex, int pageSize);
     ...many other lines
    bool Load<T>(T item, Expression<Func<T, bool>> expression) where T : class, new();
    bool Load<T>(T item, string column, object value) where T : class, new();
}

Load メソッドがジェネリックとして定義されており、それらのジェネリック型名がインターフェイスのジェネリック型と同じであるため、コンパイラの警告が発生することに注意してください。

私の質問は次のとおりです: Load メソッドは本当にジェネリックであることを意図していますか、それとも間違いでしたか? メソッドがジェネリックであることを意図している場合、コンパイラを満足させるために、型名を「T」から「E」などの別のものに変更する必要がありますか?

4

3 に答える 3

1

それらは異なるものではないはずです-ロードはリポジトリの「タイプ」で機能するはずなので、そこで定義を削除できます(それがあなたがしていることだと思います)

于 2009-07-16T07:27:18.640 に答える
0

classnew制約はメソッドレベルではなくクラスレベルにあるべきだと私には思えます。

そうでなければ、ええ-あなたは2つの異なるT制約を定義しましたが、これは私がこれを行うことができたので、地獄と混同されます:

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

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

持ってIRepository<int> Load<string>いることは私にはかなり奇妙に思えます。

Tはメソッドに対してのみである必要があり、他のメソッドに対してはそうではない可能性があります。その場合、次のようなものが必要になる場合があります。classnewLoad

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

これはまったく同じではありません。なぜなら、-から継承するTClassことができるからですが、その結果を生成するために私が考えることができる最も近い制約です。T

于 2009-07-16T20:06:25.873 に答える
0

クラスレベルのTとは異なり、制約があるため、異なるはずだと思います。

于 2009-07-16T06:52:59.270 に答える