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(..) には 2 つの実装があります。dynamic キーワードは、実行時に対応する実装を決定するために使用されます。デバッグ中にコードをステップ実行しようとすると、メソッド本体にブレークポイントが設定されていない限り、デバッガーは対応する printOutImpl(..) メソッドに入りません。

したがって、私の質問は、そのような動作を無効/変更するオプションがあるかどうかです。ブレークポイントを設定 (および削除) して、デバッガーがメソッド本体に入るようにするのは本当に面倒です。

ありがとう!ディノニ

4

1 に答える 1

1

「ステップ オーバー」(F10) の代わりに「ステップ イン」(F11) を使用します。私はあなたのコードをテストしました、そしてそれは正しくそしてにステップインしprintOutImpl(B bObj)ますConsole.WriteLine("B");

于 2013-05-09T12:28:14.543 に答える