c# - 没有从派生到基础类的装箱转换

标签 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'.

原因是什么,我该如何解决?

这与先前的问题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();

    }
}

最佳答案

要解决编译器错误,您需要限制派生类中的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作为基类的type参数的参数。

关于c# - 没有从派生到基础类的装箱转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21737055/

相关文章:

c# - 在 sql server 中存储字母数字(如 pan 卡、选民 ID)的首选数据类型是什么?

C# 多个 BackgroundWorker

Java错误: Bad Operand Type for binary operator <

c++ - 多级继承/多态和虚函数

java - 该类型必须实现继承的抽象方法

c# - DevExpress gridView 数据源

c# - 创建调用表达式树的表达式树

generics - 在 TypeScript 泛型中使用 "extends"关键字

ios - 仅适用于数字类型的通用类型约束

python - Python 中的参数化继承?