C# 使用动态关键字时的调试问题(VS2010)

C# 使用动态关键字时的调试问题(VS2010),c#,debugging,dynamic-keyword,C#,Debugging,Dynamic Keyword,在调试(大部分)用C#编写的编译器时,我注意到以下问题,我试图将其映射到简化的代码片段: public class Program { public abstract class Base { public abstract void foo(); } public class A : Base { public override void foo() { Console.Write

在调试(大部分)用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;
    }
}
基本上,有两种打印输出(..)的实现。dynamic关键字用于在运行时确定相应的实现。当我调试并尝试单步执行代码时,除非在方法体中设置了断点,否则调试器不会进入相应的printOutImpl(..)方法

因此,我的问题是,是否存在禁用/修改此类行为的选项。设置(并删除)断点以强制调试器进入方法体,这真的很烦人

谢谢!
dinony使用“跨入”(F11)而不是“跨过”(F10)。我测试了您的代码,它正确地进入了
printOutImpl(B bObj)
Console.WriteLine(“B”)

嗯,奇怪……我可以在VS2010中重现这个问题,但我找到了一个解决方法:在执行
printOutImpl((动态)obj)之前调试时,如果我说要进入Specific>System.Action`3.Invoke,它可以工作。在VS2012中一切都可以正常工作。@Tim S:我尝试过-对我来说,调试器跳转到反汇编:System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2。@Vyacheslav Volkov:安装的VS2012,确实可以工作。谢谢你的回复!您可能正在使用Visual Studio 2012。在VS2010中,在这种情况下,“进入”对我不起作用。Tim S.也可以复制我描述的内容。如果您真的在使用VS2010,了解您的调试设置会很酷。请将您的设置与我的设置进行比较。顺便说一下,我正在使用VS2010 Ultimate。转到“工具”->“导入和导出设置”->“导出选定的环境设置”,然后仅标记“选项\调试”框。以下是我的设置: