リポジトリ用にこのインターフェースを作成しました。
public interface IRepository<T, in TKey> where T: class
{
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
IEnumerable<T> FindAll();
T FindSingle(TKey id);
void Create(T entity);
void Delete(T entity);
void Update(T entity);
}
このFindSingle
メソッドは、主キーの検索に使用される ID を受け入れます。を使用するin
ことで、参照型を as としてのみ渡すことができると予想していましたTKey
。好奇心から、具象クラスを作成して int として指定することにしたので、例外を確認できました。
MSDNを調べたところ、これは機能しないと指定されています
ジェネリック型パラメーターの共変性と反変性は、参照型ではサポートされていますが、値型ではサポートされていません。
作成したクラスはこんな感じ
public class ProjectRepository : IRepository<Project,int>
{
public IEnumerable<Project> Find(Expression<Func<Project, bool>> predicate)
{
throw new NotImplementedException();
}
public IEnumerable<Project> FindAll()
{
throw new NotImplementedException();
}
public Project FindSingle(int id)
{
throw new NotImplementedException();
}
public void Create(Project entity)
{
throw new NotImplementedException();
}
public void Delete(Project entity)
{
throw new NotImplementedException();
}
public void Update(Project entity)
{
throw new NotImplementedException();
}
}
TKey
値の型として指定したビルドで例外が発生しなかったのはなぜですか? また、パラメータから を削除するin
と、何が失われますか? MSDN のドキュメントには、反変性により派生型の少ない型を使用できると書かれていますが、それを削除するin
ことで、まだジェネリックであるため、任意の型を渡すことができます。
これは、反分散と共分散に関する理解の欠如を示している可能性がありますが、少し混乱しています。