繁体   English   中英

将VB.NET事件转换为C#

[英]Converting VB.NET event to C#

我正在查看旧的VB.net代码

Public Event TagDetected(ByVal t As Tag)
...
RaiseEvent TagDetected(t)

我正在尝试转换为C#。 我的尝试:

public event EventHandler<Tag> TagDetected;
...
TagDetected(this, t.Clone());

不起作用,给我一个错误:

错误1类型XYZ.VKM.Common.Tag不能用作通用类型或方法System.EventHandler中的类型参数TEventArgs。 没有从“ XYZ.VKM.Common.Tag”到“ System.EventArgs”的隐式引用转换。

我想你打算写:

public event EventHandler<TagEventArgs> TagDetected;

其中TagEventArgs是您自己的EventArgs子类,公开了DetectedTag属性。 这样可以确保严格遵守事件处理程序模式(即,在任何处理程序中,您始终可以将EventArgs称为EventArgs,而不必知道它们只是一个int,或者在您的情况下,只是一个标记)。

EventHandler {TEventArgs}委托适用于采用从EventArgs类派生的泛型类型的函数。 在您的示例中, Tag类不是从EventArgs派生的,这就是为什么您会收到错误消息。

event关键字不必与EventHandlerEventHandler{TEventArgs}委托一起使用,但实际上可以与任何委托一起使用。 在这种情况下,您可以更好地翻译代码,如下所示:

public event Action<Tag> TagDetected;
...
TagDetected(t.Clone());

VB中有两种形式的事件声明-一种使用显式委托类型,另一种使用隐式委托类型-您使用了隐式委托方法。 C#仅具有显式委托类型方法。 等效的C#代码为:

public delegate void TagDetectedEventHandler(Tag t);
public event TagDetectedEventHandler TagDetected;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM