面向对象的投放错误

时间:2018-07-02 08:40:03

标签: c# .net oop generics inheritance

将派生类铸造为基类

我有一个通用的基础抽象类,它继承自IComparable,其定义如下

public abstract class BaseClass<T> where T : IComparable
{
    protected readonly T Data;

    protected BaseClass(T data)
    {
        Data = data;
    }

    public abstract T Get();

}

然后我定义了一个类,该类继承自该基类并具有特定的泛型类型,其定义如下:

public class Name : BaseClass<String>
{
    public Name(string data) : base(data)
    {
    }

    public override string Get()
    {
        throw new NotImplementedException();
    }
}

由于泛型类型是字符串,并且字符串是从IComparable继承的,所以我希望能够将具有字符串值的新Name对象定义为泛型类型,但是这样定义Name对象时会出现强制转换错误:

BaseClass<IComparable> obj;
obj = new Name("behro0z");

,错误是

  

错误CS0029无法隐式转换类型ConsoleApplication1.Name   至   ConsoleApplication1.BaseClass<System.IComparable> ConsoleApplication1

1 个答案:

答案 0 :(得分:2)

您要声明类型为Code Description Start_Year End_Year A Acme 1985 2002 B Coakc 2011 2012 A Jupiter(11) 2011 C Capital Management Corporation 2011 D Diuretics Inc 2011 E Charter 2011 的变量,并将BaseClass<T>替换为T

这是有效的,但这不是IComparable类的 。即使Name实现了BaseClass<string>,它还是来自BaseClass<IComparable>不是 string

您可以将变量IComparable声明为obj类型,或者将其派生为更多类型,BaseClass<string>

阅读协方差C# Generics Inheritance Problem