Ошибка приведения класса к его интерфейсу с универсальным типом (когда также приведен универсальный тип к его базе) - PullRequest
2 голосов
/ 27 апреля 2019

Здравствуйте, у меня есть следующая проблема приведения классов.У меня есть класс Quest, который другие наследуют

public class Quest{}

public class QuestChild: Quest{}

Я использую универсальный валидатор, который ожидает получить какой-либо тип квеста

public interface IQuestValidator<in T> where T:Quest
{
    bool IsCompleted(T quest);

    bool IsFailed(T quest);
}

public class QuestValidator<T>: IQuestValidator<T> where T: Quest
{    
    public bool IsCompleted(T quest)
    {
        return false;
    }

    public bool IsFailed(T quest)
    {
        return true;
    }
}

Когда я создаю валидатор для каждого производного класса QuestЯ хочу привести его к базовому выражению следующим образом:

    IQuestValidator<Quest> c = (IQuestValidator<Quest>)new QuestValidator<QuestChild>();

Но когда я выполняю эту строку, она возвращает ошибку «InvalidCastException».Почему это происходит или как я могу решить эту проблему для правильного приведения?

Примечание. Кажется, что этот вопрос похож на Проблема дисперсии C #: назначение List как List , но так какЯ не использую IEnumerable, я не могу сделать то же самое.

1 Ответ

1 голос
/ 27 апреля 2019

Соответствующий класс является инвариантом, так что нет никакого способа, которым было бы возможно приведение!Попробуйте переосмыслить свой дизайн, чтобы убрать спрос на желаемый актерский состав.

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