昨日、Windows フォーム アプリケーションのデバッグ中に興味深い動作を見つけました。次のコードを参照してください。
bool enter = false;
Debugger.Break();
if (enter) // Force to enter the if clause, read next comment
{
bool a = false; // Bypass previous IF check in debug using 'Set Next Statment (CTRL-SHIFT-F10)' here
// Will throw null reference exception
// If I don't use invoke everything works fine
Invoke(new MethodInvoker(() =>
{
a = true;
}));
}
そのため、メソッド コンテキストに入力することを想定していない IF 句を強制的に入力し、かつコードに IF 句内の任意のオブジェクトを使用する Invoke デリゲートがある場合、null 参照例外がスローされます。
例外スタック トレース:
at WindowsFormsApplication2.Form1.Test() in c:\WindowsFormsApplication2\Form1.cs:line 26
at WindowsFormsApplication2.Form1.Form1_Load(Object sender, EventArgs e) in c:\WindowsFormsApplication2\Form1.cs:line 16
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
メソッドコンテキストでオブジェクトが作成されていないように見えますが、Invoke がある場合にのみ発生します。それ以外の場合は機能します。
例外の根本的な原因と、まだ呼び出されていない Invoke メソッドに関連している理由を知っている人はいますか?