Присвойте интерфейс реализации класса типа generi c интерфейсу типа generi c - PullRequest
0 голосов
/ 30 марта 2020

Я не уверен, что мой вопрос понятен, поэтому я поясню его по коду:

В основном у меня есть интерфейс загрузчика, с типом generi c в качестве интерфейса. Здесь и Cat, и Dog реализуют IAnimal.

private readonly IAnimalLoader<Cat> _catLoader;
private readonly IAnimalLoader<Dog> _dogLoader;

private IAnimalLoader<IAnimal> animalLoader;

public AnimalService(IAnimalLoader<Cat> catLoader,
                     IAnimalLoader<Dog> dogLoader)
{
    _catLoader = catLoader;
    _dogLoader = dogLoader;
}

Проблема заключается в том, что при попытке назначить любой из загрузчиков в animalLoader:

if (animal == AnimalType.Cat)
{
    animalLoader = _catLoader;
}
else
{
    animalLoader = _dogLoader;
}

C# жалуется на нет неявных преобразование из Cat в IAnimal, даже если оно реализует его. Кажется, ни один актер не решит проблему.

Есть идеи, что я делаю неправильно?

РЕДАКТИРОВАТЬ: Вот IAnimalLoader для разъяснения

public interface IAnimalLoader<T> where T : IAnimal
{
    IQueryable<T> GetAllQueryable();
    Task<T> GetAsync(string id);
}

1 Ответ

1 голос
/ 30 марта 2020

В то время как Cat реализует IAnimal, IAnimalLoader<Cat> не имеет такой связи с IAnimalLoader<IAnimal>, о чем и говорится в сообщении об ошибке.

Как правило, нужно отметить универсальный c В качестве ковариантного параметра для успешного преобразования используется синтаксис out T IIR C, в противном случае проверьте ссылку на язык C# на дисперсию обобщений.

Обновлено (благодаря комментарию ниже): В Ваш случай, даже это невозможно, так как один из типов, Task<T>, является инвариантным. Только интерфейсы могут быть помечены как варианты, классы не могут быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...