У меня появляется следующее сообщение об ошибке во время компиляции:
"Недопустимая дисперсия: параметр типа 'T' должен быть неизменным для 'ConsoleApplication1.IRepository.GetAll ()'. 'T' iscovariant. "
и ниже мой код:
class Program
{
static void Main(string[] args)
{
IRepository<BaseClass> repository;
repository = new RepositoryDerived1<Derived1>();
Console.ReadLine();
}
}
public abstract class BaseClass
{
}
public class Derived1 : BaseClass
{
}
public interface IRepository<out T> where T: BaseClass, new()
{
IList<T> GetAll();
}
public class Derived2 : BaseClass
{
}
public abstract class RepositoryBase<T> : IRepository<T> where T: BaseClass, new()
{
public abstract IList<T> GetAll();
}
public class RepositoryDerived1<T> : RepositoryBase<T> where T: BaseClass, new()
{
public override IList<T> GetAll()
{
throw new NotImplementedException();
}
}
Мне нужно было бы иметь возможность использовать вышеупомянутый класс, как этот:
Репозиторий IRepository;
или
RepositoryBase репозиторий;
Тогда я бы хотел иметь возможность назначить что-то вроде этого:
repository = new RepositoryDerived1 ();
Но это дает ошибку времени компиляции в классе IRepository.
Если я удаляю ключевое слово "out" из класса IRepository, это дает мне еще одну ошибку,
"RepositoryDerived1"невозможно преобразовать в «IRepository».
Почему и как это исправить?
Спасибо