您好,我有下一个问题课堂讲解。我有一个别人继承的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的每个派生类创建验证器时,我想将其强制转换为它的Base clase,如下所示:

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


但是,当我执行此行时,它将返回错误“ InvalidCastException”。为什么会发生这种情况,或者我该如何解决才能正确投放?

注意:似乎与此问题C# variance problem: Assigning List<Derived> as List<Base>类似,但是由于我没有使用IEnumerable,所以我无法做到这一点。

最佳答案

对应的类是不变的,因此无法进行强制转换!
尝试重新考虑您的设计以消除对所需演员表的需求。

关于c# - 将类强制转换为具有通用类型的接口(interface)时(将通用类型也强制转换为其基类时),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55882988/

10-13 06:22