此代码错误的原因是什么
将派生类铸造为基类
true
答案 0 :(得分:1)
您应该收听编译器。您应该收到此错误:
在通用类型或方法“ BaseClass”中,类型“ System.IComparable”不能用作类型参数“ T”。从'System.IComparable'到'System.IComparable'没有隐式引用转换。
那是你的第一个问题。
因此您可以将BaseClass<T>
更改为:public abstract class BaseClass<T> where T : IComparable
。
Bu现在您遇到此错误:
无法确定条件表达式的类型,因为'Age'和'Name'之间没有隐式转换
这是因为您的DateTime.Now.Ticks == 100 ? new Age(110) : new Name("behroz")
不能确保您指定的是通用类型。
现在,如果我尝试将其更改为DateTime.Now.Ticks == 100 ? (BaseClass<IComparable>)new Age(110) : (BaseClass<IComparable>)new Name("behroz")
,则会出现以下错误:
无法将类型“年龄”转换为“ BaseClass”
无法将类型“名称”转换为“ BaseClass”
现在这变得更有趣了。
仅由于Int64
是IComparable
,所以并不意味着表示BaseClass<Int64>
是BaseClass<IComparable>
。不是。
与BaseClass<String>
和BaseClass<IComparable>
相同。
对于类型BaseClass<IComparable>
和Name
,您根本无法使用Age
。
答案 1 :(得分:-5)
您正在尝试启动抽象类,这是错误的。
BaseClass baseClass;
baseClass = new Age(110);
将派生类(即BaseClass)铸造为基类会导致此问题。
您可以根据自己的情况直接调用课程。