我一直以为C#在运行时通过查看方法调用接收者(即点号前的对象)的运行时类型来动态解析方法调用。
但是以下代码示例工作方式不同。如果我在代码中使用GenericSpaceShip,则返回“Generic”;如果我使用SpaceShip,则返回“Specific”。请注意,两种情况下的运行时类型都是SpaceShip。
所以我的问题是:C#如何解析Visit方法调用,并为什么在这种情况下它会查看编译时而不是运行时类型?
请注意,这两个Visit方法具有不同的参数。正如Patko指出的那样,这意味着我不能在这里使用虚拟/重写。
但是以下代码示例工作方式不同。如果我在代码中使用GenericSpaceShip,则返回“Generic”;如果我使用SpaceShip,则返回“Specific”。请注意,两种情况下的运行时类型都是SpaceShip。
所以我的问题是:C#如何解析Visit方法调用,并为什么在这种情况下它会查看编译时而不是运行时类型?
请注意,这两个Visit方法具有不同的参数。正如Patko指出的那样,这意味着我不能在这里使用虚拟/重写。
class GenericSpaceShip
{
public void Visit(GenericPlanet planet)
{
Console.WriteLine("Generic");
}
}
class SpaceShip : GenericSpaceShip
{
public void Visit(Planet planet)
{
Console.WriteLine("Specific");
}
}
class GenericPlanet { }
class Planet : GenericPlanet { }
class Starter
{
static void Main(string[] args)
{
// SpaceShip ship = new SpaceShip();
GenericSpaceShip ship = new SpaceShip();
Planet planet = new Planet();
ship.Visit(planet); // => Generic
}
}