Как исправить эту ошибку?Недопустимая дисперсия: параметр типа 'T' должен быть неизменным для - PullRequest
4 голосов
/ 14 сентября 2011

У меня появляется следующее сообщение об ошибке во время компиляции:

"Недопустимая дисперсия: параметр типа '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».

Почему и как это исправить?

Спасибо

1 Ответ

4 голосов
/ 14 сентября 2011

IList<T> не является ковариантным. Если вы измените IList<T> на IEnumerable<T> и удалите ограничение : new() из IRepository<out T> (так как абстрактный базовый класс не удовлетворяет этому), оно будет работать:

public interface IRepository<out T> where T : BaseClass
{
    IEnumerable<T> GetAll();
}

public abstract class RepositoryBase<T> : IRepository<T> where T : BaseClass, new()
{
    public abstract IEnumerable<T> GetAll();
}

public class RepositoryDerived1<T> : RepositoryBase<T> where T : BaseClass, new()
{
    public override IEnumerable<T> GetAll()
    {
        throw new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...