2013-05-08 32 views
3

當在調試編譯器(主要)C#編寫的,我注意到了以下問題,我試圖映射到一個簡化的代碼片斷:調試問題(VS2010)使用動態關鍵字

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(..)的兩個實現。動態關鍵字用於確定運行時的相應實現。當我正在調試並嘗試遍歷代碼時,調試器將不會輸入相應的printOutImpl(..)方法,除非在方法體中設置了斷點。

所以我的問題是是否有一個選項來禁用/修改這種行爲。真是惱人的設置(和刪除)斷點來強制調試器進入方法體。

謝謝! dinony

+0

嗯,奇怪的......我可以在VS2010中重現這個問題,但我發現了一個解決方法:在執行'printOutImpl((dynamic)obj)之前進行調試;',如果我說進入特定的> System.Action '3.調用,它的工作。 – 2013-05-08 13:18:19

+1

在VS2012中一切正常。 – 2013-05-08 13:28:13

+0

@Tim S:我試過了 - 對我來說,調試器跳轉到反彙編:System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2。 – dinony 2013-05-08 13:40:26

回答

1

使用「step into」(F11)而不是「step over」(F10)。我測試了你的代碼,並且它正確地進入了printOutImpl(B bObj)Console.WriteLine("B");

+0

您可能正在使用Visual Studio 2012.在VS2010中,「進入」對此並不適用。 Tim S.也可以重現我所描述的。如果你真的使用VS2010,知道你的調試設置會很酷。 – dinony 2013-05-09 13:21:54

+0

將您的設置與我的相比較。順便說一下,我正在使用VS2010 Ultimate。轉到「工具」 - >「導入和導出設置」 - >「導出選定的環境設置」,然後只標記「選項\調試」框。以下是我的設置:http://pastebin.com/S91HkBt1 – 2013-05-09 23:59:23