我正在查看旧的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;。
答案 0 :(得分:2)
我想你打算写:
public event EventHandler<TagEventArgs> TagDetected;
其中TagEventArgs是您自己的EventArgs子类,公开DetectedTag属性。这可以确保严格遵守事件处理程序模式(即,您可以始终在任何处理程序中将EventArgs称为EventArgs,而不必知道它们只是一个int,或者在您的情况下,只是一个标记)。 p>
答案 1 :(得分:2)
EventHandler{TEventArgs} delegate用于获取从EventArgs类派生的泛型类型的函数。在您的示例中,Tag
课程并非来自EventArgs
,这就是您收到错误的原因。
event
关键字不必与EventHandler
或EventHandler{TEventArgs}
代理一起使用,但实际上是任何代理。在这种特殊情况下,您可以更好地翻译代码,如下所示:
public event Action<Tag> TagDetected;
...
TagDetected(t.Clone());
答案 2 :(得分:2)
VB中有两种形式的事件声明 - 一种使用显式委托类型,另一种使用隐式委托类型 - 您使用了隐式委托方法。 C#只有明确的委托类型方法。 等效的C#代码是:
public delegate void TagDetectedEventHandler(Tag t);
public event TagDetectedEventHandler TagDetected;