我真的不明白这段代码有什么问题。它抛出了几个错误:
错误CS0079:事件
的左侧core.Events.Event.thisEvent
只能出现 在+=
或-=
运算符错误CS0070:只能显示事件
core.Events.Event.thisEvent
在该类型之外使用时,在+=
或-=
的左侧core.Events.Event
错误CS1502:最佳重载方法匹配
System.Delegate.Combine(System.Delegate, System.Delegate)
有一些 无效的参数错误CS1503:参数
#1
无法将object
表达式转换为类型System.Delegate
我做错了什么,如何解决这个问题?
using System;
using System.Runtime.CompilerServices;
namespace core.Events
{
public class Event
{
public delegate void EventDelegate (object from,EventArgs args);
public event Event.EventDelegate thisEvent {
[MethodImpl(MethodImplOptions.Synchronized)]
add {
this.thisEvent += (Event.EventDelegate)Delegate.Combine (this.thisEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove {
this.thisEvent -= (Event.EventDelegate)Delegate.Remove (this.thisEvent, value);
}
}
public void call (object from, EventArgs args)
{
this.thisEvent (from, args);
}
}
}
提前感谢您的帮助,我认为我只是非常疲惫而且迷失在源头......
答案 0 :(得分:2)
与使用属性的getter中的属性名称类似的错误。这通常会导致SO,然而这个错误很早就被发现了。您需要创建一个私有支持字段来存储委托,当您显式编写访问器时,编译器不再为您自动生成它。因此:
private EventDelegate eventImpl;
public event Event.EventDelegate thisEvent {
[MethodImpl(MethodImplOptions.Synchronized)]
add {
this.eventImpl += value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove {
this.eventImpl -= value;
}
}
public void call(object from, EventArgs args) {
var handler = this.eventImpl;
if (handler != null) handler(from, args);
}
请注意call()实现,它可以避免在没有人订阅事件时发生崩溃,而在线程取消订阅事件时会发生另一次崩溃。我使用快捷符号来避免显式调用Delegate.Combine()。请注意,如果您不使用访问器,此代码实际上与编译器自动生成的代码不同。