为何已定义事件的Academy类仍未实现INotifyMessageChanged接口?
接口事件实现错误:CS0535 问题解决
问题场景
学习C#事件机制时编写了以下代码:
public interface INotifyMessageChanged { public event EventHandler MessageChanged; } public class Academy : Organization, INotifyMessageChanged { public event EventHandler? NotifySubScriber; private string message = ""; public string Message { get { return message; } set { message = value; MessageChanged(); } } public Academy(string name, string address) : base(name) { Address = address; } void MessageChanged() { NotifySubScriber?.Invoke(this, null); } }
运行时触发编译错误:
CS0535 'Academy' does not implement interface member 'INotifyMessageChanged.MessageChanged'
错误原因
你混淆了事件和方法的定义:
- 接口
INotifyMessageChanged要求实现的是名为MessageChanged的事件,但你的Academy类中并没有定义这个事件,反而写了一个同名的私有方法MessageChanged(),二者是完全不同的成员类型,编译器无法识别为接口实现。 - 类中定义的事件
NotifySubScriber名称与接口要求的MessageChanged不匹配,编译器找不到接口要求的事件实现,因此报错。
解决方法
方法一:直接实现接口要求的事件
删除多余的NotifySubScriber事件,直接使用接口定义的MessageChanged事件:
public interface INotifyMessageChanged { public event EventHandler MessageChanged; } public class Academy : Organization, INotifyMessageChanged { // 实现接口要求的事件 public event EventHandler? MessageChanged; private string message = ""; public string Message { get { return message; } set { message = value; // 触发事件,建议传递EventArgs.Empty而非null MessageChanged?.Invoke(this, EventArgs.Empty); } } public Academy(string name, string address) : base(name) { Address = address; } }
方法二:显式实现接口事件(保留自定义事件名称)
如果需要保留类自己的事件名称,可以通过显式接口实现,将接口事件转发到自定义事件:
public interface INotifyMessageChanged { public event EventHandler MessageChanged; } public class Academy : Organization, INotifyMessageChanged { // 类自定义的事件 public event EventHandler? NotifySubScriber; // 显式实现接口的事件,内部绑定到自定义事件 event EventHandler INotifyMessageChanged.MessageChanged { add => NotifySubScriber += value; remove => NotifySubScriber -= value; } private string message = ""; public string Message { get { return message; } set { message = value; NotifySubScriber?.Invoke(this, EventArgs.Empty); } } public Academy(string name, string address) : base(name) { Address = address; } }
注意事项
- 触发事件时,推荐传递
EventArgs.Empty而非null,这是.NET事件模型的规范做法。 - 接口实现必须严格匹配成员的名称、类型和访问修饰符,事件和方法是不同的成员类型,不能混淆使用。
内容的提问来源于stack exchange,提问作者Aleksandar
相关产品推荐
相关产品推荐

