将VB.NET事件转换为C#

时间:2014-11-10 18:34:18

标签: c# .net vb.net

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

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

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

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

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

  

错误1类型&#39; XYZ.VKM.Common.Tag&#39;不能用作类型参数&#39; TEventArgs&#39;在泛型类型或方法&#39; System.EventHandler&#39;。来自&#39; XYZ.VKM.Common.Tag&#39;没有隐式参考转换。到&#39; System.EventArgs&#39;。

3 个答案:

答案 0 :(得分:2)

我想你打算写:

public event EventHandler<TagEventArgs> TagDetected;

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

答案 1 :(得分:2)

EventHandler{TEventArgs} delegate用于获取从EventArgs类派生的泛型类型的函数。在您的示例中,Tag课程并非来自EventArgs,这就是您收到错误的原因。

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

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

答案 2 :(得分:2)

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

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