【发布时间】:2019-09-16 21:00:47
【问题描述】:
你好我有下一个问题铸造类。我有一个其他人继承的 Quest 类
public class Quest{}
public class QuestChild: Quest{}
我使用了一个通用的验证器,它期望接收某种类型的 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 类,如下所示:
IQuestValidator<Quest> c = (IQuestValidator<Quest>)new QuestValidator<QuestChild>();
但是当我执行这一行时,它返回错误“InvalidCastException”。为什么会发生这种情况,或者我该如何解决才能正确投射?
注意:这似乎类似于这个问题C# variance problem: Assigning List<Derived> as List<Base>,但由于我没有使用 IEnumerable,所以我不能这样做。
【问题讨论】:
-
你为什么要执行演员阵容,而不仅仅是将其声明为 IQuestValidator
c(或 var)? -
@Metheny 我想将其转换为通用 IQuestValidator
因为我有一个“注入器”,它基于返回该泛型类的类型,例如 refs = new Dictionary >();我需要所有 Quest 验证器都有一个通用接口 -
谢谢@Greg。我认为我的案例与使用 List 的问题不同,但第一个链接接近我正在尝试做的事情,但我使用 Quest 作为类,在该示例中,Quest 将是一个接口。我会试试看它是否有效