私は再現します。これは間違いなくデバッガーのバグであり、修正するのは非常に難しいようです。コードをvb.netからC#に逆コンパイルすると見やすくなります。このサンプルコード:
Class Test
Public Event Foo As EventHandler
Public Event Bar As EventHandler
Public Sub Run(ByVal arg As Integer)
If arg = 0 Then
RaiseEvent Foo(Me, EventArgs.Empty)
Else
RaiseEvent Bar(Me, EventArgs.Empty)
End If
End Sub
End Class
この同等のC#コードに変換されます:
public void Run(int arg)
{
EventHandler VB$t_ref$S0;
if (arg == 0)
{
VB$t_ref$S0 = this.FooEvent;
if (VB$t_ref$S0 != null)
{
VB$t_ref$S0(this, EventArgs.Empty);
}
}
else
{
VB$t_ref$S0 = this.BarEvent;
if (VB$t_ref$S0 != null) // <=== HERE!!!
{
VB$t_ref$S0(this, EventArgs.Empty);
}
}
}
Set Next Statementデバッガコマンドを使用して実行ポイントを2番目のRaiseEventステートメントに設定すると、デバッガは実行ポイントを上記のスニペットでHEREでマークされたステートメントに移動します。一時変数の初期化をバイパスします。これはまだnullなので、イベントは発生しません。コマンドを使用した後、デバッグ+ Windows +逆アセンブリを使用してマシンコードを確認することで、これが発生していることを確認できます。
それ以外の点では、これはC#プログラマーに非常によく知られているまったく同じ種類のイベント発生コードであり、発生イベントアクセサーがないため、次のように記述する必要があります。
var temp = Bar;
if (temp != null) {
Bar(this, EventArgs.Empty);
}
さて、デバッガーはこれをいじくり回します、それがどのように起こり得るかを見るのは簡単です。そして、それが長い間検出されなかった(または無視された)状態が続いた可能性があります。回避策を見つけるのは困難です。RaiseEventステートメントの前のステートメントは機能しますが、非常に実用的ではありません。Ifステートメントが目的のイベントを実行するように変数を変更することが可能です。
私はconnect.microsoft.comで問題を報告しました、フィードバック記事はここにあります。奇跡を期待しないでください。