2013-02-17 29 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

相关问题