2013-02-17 30 views
1

請看看下面的代碼:代表參數是否需要匹配事件簽名?

Public Delegate Sub TestButtonClick(ByVal test As Integer) 

Public Class Person 
    Private Name As String 
    Private ID As Integer 
    Public Event ButtonClick As TestButtonClick 

    Public Sub DelegateTest1(ByVal Test As Integer) 
     MsgBox(Test) 
    End Sub 

    Public Sub ChangeName() 
     RaiseEvent ButtonClick(1) 
    End Sub 

    Public Sub DelegateTest2() 
     MsgBox("Delegate Test 2") 
    End Sub 

    Public Sub DelegateTest3() 
     MsgBox("Delegate Test 3") 
    End Sub 

End Class 

Public Class Form1 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim p1 As Person = New Person 
     AddHandler p1.ButtonClick, AddressOf p1.DelegateTest1 
     AddHandler p1.ButtonClick, AddressOf p1.DelegateTest2 
     AddHandler p1.ButtonClick, AddressOf p1.DelegateTest3 
     p1.ChangeName() 
    End Sub 
End Class 

輸出是:

1 
DelegateTest2 
DelegateTest3 

我不明白爲什麼這個應用程序編譯即代表接受其簽名,但Person.DelegateTest2Person.DelegateTest3整數不要。

如果我改變Person.DelegateTest2()來那麼下面我一樣我希望得到一個錯誤:

Public Sub DelegateTest2(ByVal Test As Integer, ByVal Test2 As Integer) 
     MsgBox("Delegate Test 2") 
    End Sub 

爲什麼委派允許您傳遞零個參數時有爭論,即一個整數在我的情況?

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 – 2013-02-17 12:35:04

+0

@John Saunders,謝謝。 Point指出。 – w0051977 2013-02-17 12:36:11

回答

2

不要忘記,VB.NET繼承了心愛的VB的所有傳統行李。

Option Strict On 

此外,我建議你設置這是default option:所以它表現爲一個真正的.NET編程語言,而不是某種混合廢話,你可以把它嚴格通過將以下到您的文件的頂部這樣你就不會在荒野中找到自己。

+0

謝謝。爲什麼它仍然允許你通過零爭論,如果選項嚴格關閉? – w0051977 2013-02-17 12:46:34

+0

男人我絕對不知道。我想這是那些* VB.NET thingies *之一。 VB.NET也是你使用弱打字,因爲這就是它在VB中。你看過生成的IL嗎?我有,它是一個真正的混亂:-)真的,如果你想使用這種語言做一些.NET開發,請使用'Strict On'選項。否則C#。 – 2013-02-17 12:47:46

+0

@ w0051977 - VB.Net的最新版本添加了一個名爲「寬鬆代表」的功能。我不確定這是否能解釋您所看到的行爲,但您可以查看並查看。 – 2013-02-18 15:40:30

相關問題