【发布时间】:2011-01-27 17:07:15
【问题描述】:
我想做如下的事情:
Public Class Form1
Public Event Evt1(ByVal c As c1)
Public Event Evt2(ByVal c As c2)
Private Sub OnEvt1OrEvt2(ByVal c As c1) Handles Me.Evt1, Me.Evt2
End Sub
End Class
Public Class c1
End Class
Public Class c2
Inherits c1
End Class
但是,它似乎是无效的语法,因为 OnEvt1OrEvt2 的签名与 Evt2 的签名不匹配。
有什么办法可以做到吗?
编辑: 上面的代码似乎对除我以外的所有人都可以正常工作,但它在 VS2005 SP1 中无法为我编译。
错误信息类似于:
错误 BC31029:方法 'Private Sub OnEvt1OrEvt2(c As WindowsApplication1.c1)' 无法处理 事件'公共事件 Evt2(c As WindowsApplication1.c2)',因为 签名不匹配。
编辑 2:
我在 msdn 中找到了这个, VB相关:
http://msdn.microsoft.com/en-us/library/ms973905.aspx
表单加载中的代码分配 的 Name 属性的值 三个 Bucket 对象。它还调用 AddHandler 直接把所有的 溢出事件 处理溢出过程。尽你所能 看,单个事件处理程序可以处理 多个事件,只要所有的 事件具有兼容参数列表。
(...)
版权所有 © 2002 线人 通信集团和微软 公司
(强调我的)
不过,没有关于两个“兼容参数列表”到底是什么的消息。
编辑 3:
好的,我找到了: http://msdn.microsoft.com/en-us/library/ms364068%28v=vs.80%29.aspx#vb9overview_topic10
轻松的代表
使用创建委托时 Visual Basic 中的 AddressOf 或句柄 8.0,针对绑定到委托标识符的方法之一 必须完全匹配的签名 委托人的类型。
它是在VB9中添加的。
【问题讨论】:
-
基本上“兼容的参数列表”意味着方法签名中的每个参数类型必须与委托声明中的相应参数类型相同,或者必须有 引用转换(维护表示身份的)从委托的参数类型到方法的参数类型。
-
@Jon Skeet:我就是这么想的;该定义的任何来源?
-
C# 语言规范提供了详细信息,我确信它们对于支持此功能的 VB 版本是等效的。我现在没有关于我的参考资料,但如果你愿意,我可以稍后查找。
-
@Jon Skeet:我认为没有必要。我相信你的话 :-) 我想我家里有一份 C# 规范的副本,我会看看它(虽然它很旧,是 1.0 之前的书)。无论如何,非常感谢!
标签: .net vb.net inheritance event-handling