【发布时间】:2017-05-30 20:08:54
【问题描述】:
我有以下抽象类:
public abstract class PinkBoxMasksDataAbstract
{
public string PinkBoxText { get; set; }
}
和 2 个子类:
public class PinkBoxMasksDataNoOverlay : PinkBoxMasksDataAbstract
{
}
public class PinkBoxMasksDataOverlay : PinkBoxMasksDataAbstract
{
public int PinkBoxLeft { get; set; }
public int PinkBoxBoxTop { get; set; }
public int PinkBoxHeight { get; set; }
public int PinkBoxWidth { get; set; }
}
然后我有另一个类,它有 PinkBoxMasksDataAbstract 类作为参数:
public class ZonalMatchResult<T> where T : PinkBoxMasksDataAbstract
{
public decimal Confidence { get; set; }
public int GreenBoxLeft { get; set; }
public int GreenBoxTop { get; set; }
public int GreenBoxHeight { get; set; }
public int GreenBoxWidth { get; set; }
public List<T> PinkBoxMasksData { get; set; }
}
public class ZonalResult<T> where T : PinkBoxMasksDataAbstract
{
public int ExitCode { get; set; }
public string ErrorMessage { get; set; }
public int NumberOfGreenBoxMatches { get; set; }
public int NumberOfPinkBoxExtractFrames { get; set; }
public int ProcessingTime { get; set; }
public bool HasOverlay { get; set; }
public List<ZonalMatchResult<T>> MatchResults { get; set; }
}
现在我想这样创建这个类:
ZonalResult<PinkBoxMasksDataAbstract> zonalResult;
if (isOverlayRequired)
zonalResult = new ZonalResult<PinkBoxMasksDataOverlay>();
else
zonalResult = new ZonalResult<PinkBoxMasksDataNoOverlay>();
但我得到一个错误:
不能隐式转换类型
'Domain.ZonalResult<Domain.PinkBoxMasksDataOverlay>'到'Domain.ZonalResult<Domain.PinkBoxMasksDataAbstract>'
如果 PinkBoxMasksDataOverlay 是 PinkBoxMasksDataAbstract 的子类,为什么会发生这种情况?如何解决?
【问题讨论】:
-
创建一个非泛型的
ZonalMatchResultBase类并从中继承ZonalMatchResult<T>,然后您可以使用基类型来存储任何泛型实例。 -
ZonalMatchResult<PinkBoxMasksDataOverlay>和ZonalMatchResult<PinkBoxMasksDataNoOverlay>除了object之外没有共同的基类。类型参数的继承关系在这里无关紧要;如果它们不同,它们就是不同的。 -
@Gusman,我有一个很深的子类。真正的 ZonalMatchResult 只是嵌套类链
-
我在代码示例中看不到这一点,如果示例错误,则使用正确的数据更新它。
-
你的问题只是另一个常见问题的例子 “为什么即使我的类型参数 T1 继承了另一个类型参数 T2,我的泛型类型 G
继承泛型类型 G 。有关最早的示例之一,请参见标记的副本。有很多,它们都归结为同一件事:您想要的继承关系仅在非常特定的条件下有效,而您的代码不满足这些条件。如果没有这些条件,处理泛型类型的实例时可能会出现不安全的行为。"
标签: c# generics inheritance