C# 在关键字'之后检查实例是基类类型还是派生类类型;作为';?
请查看以下代码:C# 在关键字'之后检查实例是基类类型还是派生类类型;作为';?,c#,.net,oop,inheritance,polymorphism,C#,.net,Oop,Inheritance,Polymorphism,请查看以下代码: // Base class public abstract class Aircraft { public virtual void Fly() { Console.WriteLine("Aircraft flies"); } } // Derived class public class Plane : Aircraft { public new void Fly() { Conso
// Base class
public abstract class Aircraft
{
public virtual void Fly()
{
Console.WriteLine("Aircraft flies");
}
}
// Derived class
public class Plane : Aircraft
{
public new void Fly()
{
Console.WriteLine("Plane flies");
}
}
// Execution
public class Program
{
public static void Main()
{
var lPlane = new Plane();
Console.WriteLine(lPlane.GetType()); // Plane
lPlane.Fly(); // Plane flies
var lAircraft = lPlane as Aircraft;
Console.WriteLine(lAircraft.GetType()); // Plane
lAircraft.Fly(); // Aircraft flies
}
}
下一行将平面
投射到Aircaft
:
var lAircraft = lPlane as Aircraft;
所以我希望,lAircraft
现在是飞机的类型。但事实并非如此。它属于平面类型
:
Console.WriteLine(lAircraft.GetType()); // Plane
通过关键字as
转换后,如何检查当前实例是基类类型还是派生类类型?此代码:
var lAircraft = lPlane as Aircraft;
将编译为:
Aircraft aircraft = lPlane;
这意味着这里的as
关键字什么也不做,因为您无法将派生类转换为它的基类。要了解更多信息,您可以阅读以下答案:您不能更改对象的运行时类型;强制转换仅更改编译时类型。lAircraft.Fly();//飞机flies@Simon您已经创建了Aircraft
的一个新实例,因此是的,它确实会打印飞机飞行,但是lPlane
的类型仍然是plane,因为正如我所说的,您无法将其转换为其基类。