在调试用C#编写的编译器(主要是)时,我注意到以下问题,我试图将其映射到简化的代码片段:
public class Program
{
public abstract class Base
{
public abstract void foo();
}
public class A : Base
{
public override void foo()
{
Console.WriteLine("A");
}
}
public class B : Base
{
public override void foo()
{
Console.WriteLine("B");
}
}
public static void printOut(Base obj)
{
printOutImpl((dynamic)obj);
}
public static void printOutImpl(A aObj)
{
aObj.foo();
}
public static void printOutImpl(B bObj)
{
bObj.foo();
}
public static int Main(string[] args)
{
B bObj = new B();
printOut(bObj);
return 0;
}
}
基本上,printOut(..)有两种实现方式。 dynamic关键字用于确定运行时的相应实现。当我调试并尝试单步执行代码时,调试器将不会输入相应的printOutImpl(..)方法,除非在方法体中设置了断点。
所以我的问题是是否有禁用/修改此类行为的选项。设置(和删除)断点以强制调试器进入方法体是非常烦人的。
谢谢! dinony
答案 0 :(得分:1)
使用“步入”(F11)而不是“跳过”(F10)。我测试了您的代码,并正确地进入了printOutImpl(B bObj)
和Console.WriteLine("B")
;