Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在关键字'之后检查实例是基类类型还是派生类类型;作为';?_C#_.net_Oop_Inheritance_Polymorphism - Fatal编程技术网

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,因为正如我所说的,您无法将其转换为其基类。