簡體   English   中英

沒有從派生到基類的拳擊轉換

[英]No Boxing Conversion from Derived to Base class

我正在嘗試通過以下方案。 但是已經遇到了這個編譯時錯誤。

The type 'DerivedDefinition' cannot be used as type parameter 'T' in the generic type or method 'BaseInstance<T>'. There is no boxing conversion or type parameter conversion from 'DerivedDefinition' to 'BaseDefinition'.

原因是什么?如何解決這個問題?

這與之前的問題有關https://stackoverflow.com/questions/21718509/supporting-generic-and-non-generic-implementation

更新:這是基於下面提供的答案的正確工作代碼

public abstract class BaseDefinition 
{
    public virtual void Print() { Console.WriteLine("base definition"); }
}
public class DerivedDefinition : BaseDefinition 
{
    public override void Print() { Console.WriteLine("derived definition"); }
}


public abstract class BaseInstance
{
    protected BaseDefinition definition;
    public BaseDefinition Definition { get { return definition; } }
}

public abstract class BaseInstance<T> : BaseInstance where T : BaseDefinition
{
    //public T DefinitionExact { get { return (T)definition; } }
}

public class DerivedInstance : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}


class TestClass
{
    static void Main(string[] args)
    {
        BaseInstance baseInstance = new DerivedInstance();
        baseInstance.Definition.Print();
        //baseInstance.DefinitionExact.Print();

        DerivedInstance derivedInstance = new DerivedInstance();
        derivedInstance.Definition.Print();
    }
}

代碼下面是非常錯誤的...

public abstract class BaseDefinition 
{
    public virtual string Print() { Console.WriteLine("base definition"); }
}
public class DerivedDefinition : BaseDefinition 
{
    public override string Print() { Console.WriteLine("derived definition"); }
}


public abstract class BaseInstance
{
    private BaseDefinition definition;
    protected BaseDefinition Definition { get { return definition; } }
}

public abstract class BaseInstance<T> : BaseInstance where T : BaseDefinition
{
    protected T DefinitionExact { get { return (T)definition; } }
}

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}


class TestClass
{
    static void Main(string[] args)
    {
        BaseInstance baseInstance = new DerivedInstance<DerivedDefinition>();
        baseInstance.Definition.Print();
        baseInstance.DefinitionExact.Print();

    }
}

您對如何設置通用設置存在問題:

    public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}

當您聲明一個泛型類時,您將名稱放在<>中,這將是您的類內部處理的類型。 您想要替換,因此您的代碼如下所示:

    public class DerivedInstance<T> : BaseInstance<T>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}

要解決編譯器錯誤,您需要約束派生類中的type參數,以便它滿足基類中的約束:

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition>
    where DerivedDefinition : BaseDefinition
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}

但是,由於您的類型參數的名稱與您的一個類名相同,我懷疑您實際上是這樣做的:

public class DerivedInstance : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}

也就是說,DerivedInstance類可能根本不是通用的,而是你打算提供DerivedDefinition作為基類的類型參數的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM