3

在调试用 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(..) 方法,除非在方法体中设置了断点。

所以我的问题是是否有禁用/修改这种行为的选项。设置(和删除)断点来强制调试器进入方法体真的很烦人。

谢谢!恐龙

4

1 回答 1

1

使用“步入”(F11) 而不是“步入”(F10)。我测试了你的代码,它正确地进入了printOutImpl(B bObj)and Console.WriteLine("B");

于 2013-05-09T12:28:14.543 回答