Параметр типа out
можно использовать только ковариантно, т. Е. В типе возвращаемого значения.Следовательно, IQueryable<T> GetAll()
является правильным, а void Delete(T t)
- нет.
Поскольку T
используется одновременно и контравариантно в вашем классе, вы не можете использовать out
здесь (или in
).
Если вы хотите узнать больше о теоретических основах этого, сделайте небольшой перерыв и прочитайте статью «Ковариация и контравариантность» в Википедии .
Welcomeназад.Итак, что вы делаете, если вам нужны все эти методы в вашем хранилище, но все еще нужен ковариантный интерфейс?Вы можете извлечь ковариантную часть в ее собственный интерфейс:
interface IDataSource<out T> where T : IBusinessEntity
{
IQueryable<T> GetAll();
}
interface IRepository<T> : IDataSource<T> where T : IBusinessEntity
{
void Save(T t);
void Delete(T t);
}
Так же .NET BCL решает эту проблему: IEnumerable<out T>
является ковариантным, но поддерживает только «операции чтения».ICollection<T>
является подтипом IEnumerable<out T>
, допускает операции чтения и записи и, таким образом, не может быть сам ковариантным.