C# 没有从派生类到基类的装箱转换

C# 没有从派生类到基类的装箱转换,c#,generics,inheritance,compiler-errors,C#,Generics,Inheritance,Compiler Errors,我正在尝试完成以下场景。但是我们遇到了这个编译时错误 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

我正在尝试完成以下场景。但是我们遇到了这个编译时错误

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'.
类型“DerivedDefinition”不能用作泛型类型或方法“BaseInstance”中的类型参数“T”。没有从“DerivedDefinition”到“BaseDefinition”的装箱转换或类型参数转换。
原因是什么?我如何解决

这与前面的一个问题有关

更新:根据下面提供的答案,这是正确的工作代码

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();
    }
}
公共抽象类BaseDefinition
{
公共虚拟void Print(){Console.WriteLine(“基本定义”);}
}
公共类派生定义:BaseDefinition
{
public override void Print(){Console.WriteLine(“派生定义”);}
}
公共抽象类BaseInstance
{
受保护的基本定义;
public BaseDefinition定义{get{return Definition;}}
}
公共抽象类BaseInstance:BaseInstance,其中T:BaseDefinition
{
//公共T定义精确{get{return(T)定义;}}
}
公共类DerivedInstance:BaseInstance
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}
类TestClass
{
静态void Main(字符串[]参数)
{
BaseInstance BaseInstance=新的DerivedInstance();
baseInstance.Definition.Print();
//baseInstance.DefinitionExact.Print();
DerivedInstance DerivedInstance=新的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();

    }
}
公共抽象类BaseDefinition
{
公共虚拟字符串Print(){Console.WriteLine(“基本定义”);}
}
公共类派生定义:BaseDefinition
{
公共重写字符串Print(){Console.WriteLine(“派生定义”);}
}
公共抽象类BaseInstance
{
私有基定义;
受保护的BaseDefinition定义{get{return Definition;}}
}
公共抽象类BaseInstance:BaseInstance,其中T:BaseDefinition
{
受保护的T定义精确{get{return(T)definition;}}
}
公共类DerivedInstance:BaseInstance
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}
类TestClass
{
静态void Main(字符串[]参数)
{
BaseInstance BaseInstance=新的DerivedInstance();
baseInstance.Definition.Print();
baseInstance.DefinitionExact.Print();
}
}

您对如何设置通用代码有疑问:

    public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}
公共类DerivedInstance:BaseInstance
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}
当您声明一个泛型类时,您会在中输入名称,这将是您的类内部处理的类型。您希望替换为,以便代码如下所示:

    public class DerivedInstance<T> : BaseInstance<T>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}
公共类DerivedInstance:BaseInstance
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}

要解决编译器错误,需要约束派生类中的类型参数,使其满足基类中的约束:

public class DerivedInstance<DerivedDefinition> : BaseInstance<DerivedDefinition>
    where DerivedDefinition : BaseDefinition
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}
公共类DerivedInstance:BaseInstance
其中DerivedDefinition:BaseDefinition
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}
但是,由于类型参数的名称与一个类名相同,我怀疑您实际上是有意这样做的:

public class DerivedInstance : BaseInstance<DerivedDefinition>
{
    public DerivedInstance() 
    {
        definition = new DerivedDefinition();
    }
}
公共类DerivedInstance:BaseInstance
{
公共派生实例()
{
定义=新的DerivedDefinition();
}
}

也就是说,DerivedInstance类可能根本不是泛型的,而是您打算提供DerivedDefinition作为基类类型参数的参数。

谢谢!我注意到我在示例代码中犯了很多错误,我将用工作变量替换它。