我重播。這可以說是調試器中的一個錯誤,看起來很難解決我的問題。將代碼從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);
}
}
}
當您使用設置下一語句調試命令來設置執行點到第二RaiseEvent語句,調試器移動執行指向上面代碼片段中由HERE標記的語句。繞過臨時變量的初始化。這仍然是空的,所以事件不會被提出。您可以通過使用該命令後使用Debug + Windows + Disassembly查看機器代碼來觀察這種情況。
這在其他方面完全一樣的那種情況下提高代碼的任何C#程序員非常熟悉,他們沒有加薪事件訪問所以必須這樣寫:
var temp = Bar;
if (temp != null) {
Bar(this, EventArgs.Empty);
}
好,調試摸索這很容易看出它會如何發生。以及它如何可能長久未被發現(或忽略)。變通辦法很難得到,RaiseEvent聲明之前的一個聲明會起作用,但是非常不切實際。修改變量以便If語句執行所需的事件是可能的。
我在connect.microsoft.com報告了該問題,反饋文章is here。不要期待奇蹟。
你在編譯版本嗎? –
嗨阿德里亞諾。我正在編譯調試模式 – Martin