【发布时间】:2021-12-27 20:59:25
【问题描述】:
我有以下代码。
class Program
{
static void Main(string[] args)
{
Outer outer = new Outer();
Inner inner = new Inner();
Outer outer2 = new Inner();
Inner inner2 = new Outer();
}
}
public class Outer { }
public class Inner : Outer { }
将new Outer() 分配给inner2 时出现编译器错误,因为它的类型为Inner。我知道这与继承有关,但我不知道为什么,因为内容相同。另外,我怎样才能强制它被转换为Inner。
我试过了
(inner)new Outer();
new Outer() as Inner;
但它在前者中抛出了关于转换的异常,在后者中变为 null。不知道用谷歌搜索什么。我的意思是像 this 但恰恰相反。
【问题讨论】:
-
Outer 不是 Inner,当它不是 Inner 时,你永远不能强迫它成为 Inner。内容无关紧要。
-
如果您将事物命名为
Base和Sub,顺便说一句,这会容易得多。Outer类型的变量可以引用Outer的实例或Outer的任何子类的实例(在本例中为Inner)。但是,Inner是Outer的特化,因此Inner的变量只能引用Inner对象(或Inner的任何子类)。仅仅因为Inner在专门化Outer时没有做任何特别的事情,并不意味着它不是专门化的。考虑一下您拥有的情况,它可以编译,但随后您将成员添加到Inner。它会突然破裂 -
是的,名字非常混乱。如果只是在学习 C#,我建议尝试使用一个名为例如的类层次结构。动物 -> 昆虫 -> 蝴蝶
标签: c# inheritance .net-core .net-5