C# 继承与泛型#

C# 继承与泛型#,c#,generics,inheritance,C#,Generics,Inheritance,我有以下抽象类: public abstract class PinkBoxMasksDataAbstract { public string PinkBoxText { get; set; } } 和2个子类: public class PinkBoxMasksDataNoOverlay : PinkBoxMasksDataAbstract { } public class PinkBoxMasksDataOverlay : PinkBoxMasksDataAbstract {

我有以下抽象类:

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; }
}
公共类ZonalMatchResult,其中T:PinkBoxMasksDataAbstract
{
公共十进制置信度{get;set;}
public int GreenBoxLeft{get;set;}
public int GreenBoxTop{get;set;}
public int GreenBoxHeight{get;set;}
public int GreenBoxWidth{get;set;}
公共列表PinkBoxMasksData{get;set;}
}
公共类区域结果,其中T:PinkBoxMasksDataAbstract
{
公共int ExitCode{get;set;}
公共字符串错误消息{get;set;}
public int NumberOfGreenBoxMatches{get;set;}
public int NumberOfPinkBoxExtractFrames{get;set;}
public int ProcessingTime{get;set;}
公共bool HasOverlay{get;set;}
公共列表匹配结果{get;set;}
}
现在我想用这种方式创建这个类:

            ZonalResult<PinkBoxMasksDataAbstract> zonalResult;
            if (isOverlayRequired)
                zonalResult = new ZonalResult<PinkBoxMasksDataOverlay>();
            else
                zonalResult  = new ZonalResult<PinkBoxMasksDataNoOverlay>();
ZonalResult ZonalResult;
如果需要(isOverlayRequired)
zonalResult=新的zonalResult();
其他的
zonalResult=新的zonalResult();
但我有一个错误:

无法隐式转换类型
'Domain.ZonalResult'
'Domain.ZonalResult'


如果PinkBoxMasksDataOverlay是PinkBoxMasksDataAbstract的子类,为什么会发生这种情况?如何修复?

ZonalMatchResult
不继承自
PinkBoxMasksDataAbstract
,只有其类型参数继承。这就是原因,你会得到这个错误

您可以通过这种方式具体设置数据(当然,在这种情况下,数据可能不是抽象的):



对于接口,还可以选择,但对于类,这是不可能的。因此,不,我认为没有办法。

创建一个
ZonalMatchResultBase
非泛型类,并从中继承
ZonalMatchResult
,然后您可以使用基类型存储任何泛型实例。
ZonalMatchResult
ZonalMatchResult
没有除
对象之外的公共基类。这里,类型参数的继承关系无关紧要;“如果他们不一样,他们也不一样。”古斯曼,我有一个很深的孩子班。真正的ZonalMatchResult只是嵌套类链,我在代码示例中看不到这一点,如果示例错误,请使用正确的数据更新它。您的问题只是另一个常见问题的示例:“为什么即使我的类型参数T1继承另一个类型参数T2,我的泛型类型G也不继承泛型类型G?”. 有关最早的示例之一,请参见标记的副本。有很多,它们都归结为一件事:您想要的继承关系只在非常特定的条件下有效,并且您的代码没有满足这些条件。如果没有这些条件,处理泛型类型的实例可能会发生不安全行为。问题是生成json文件。它创建嵌套结构,如:“PinkBoxText:“75评论\r\n”,“PinkBoxCoordinates:{“PinkBoxLeft”:179,“PinkBoxBoxTop”:532,“PinkBoxHeight”:20,“PinkBoxWidth”:65},但我需要不带PinkBoxCoordinates属性
ZonalMatchResult<PinkBoxMasksDataAbstract> r = new ZonalMatchResult<PinkBoxMasksDataAbstract>;
if (isOverlayRequired)
    r.PinkBoxMasksData = new PinkBoxMasksDataOverlay();
else
    r.PinkBoxMasksData = new PinkBoxMasksDataNoOverlay();
public class Overlay
{
    public int PinkBoxLeft { get; set; }
    public int PinkBoxBoxTop { get; set; }
    public int PinkBoxHeight { get; set; }
    public int PinkBoxWidth { get; set; }
}

public class Mask
{
    public string PinkBoxText { get; set; }
    public Overlay Overlay { get; set; }
}


var mask = new Mask();
if (isOverlayRequired)
{
    mask.Overlay = new Overlay();
}