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作为基类类型参数的参数。谢谢!我注意到我在示例代码中犯了很多错误,我将用工作变量替换它。