问题
开发环境: C# .netframework4.5.2, Visualstudio2019,定义了如下接口,在接口中定义了一个委托和事件报错:错误 CS8370 功能“默认接口实现”在 C# 7.3 中不可用。请使用 8.0 或更高的语言版本。
public interface InterfaceDeSource{event ExceptionHappenedEventHandler ExceptionHappened;public delegate void ExceptionHappenedEventHandler(object sender, ClassDeviceException de);}
在C# 7.3中,接口不能直接定义事件或委托的实现,但它们可以定义事件和委托的类型。以下是如何在C# 7.3(或更早版本)的接口中定义委托和事件的示例:
定义委托
首先,你可以在接口外部定义一个委托类型,然后在接口中使用该委托类型声明事件或方法。但是,C# 允许你在接口内部直接声明委托类型,如下所示:
public interface IMyInterface
{// 在接口中定义委托类型delegate void MyDelegate(string message);// 使用委托类型声明方法void MyMethod(MyDelegate del);
}
然而,请注意,从C# 9.0开始,接口内部定义委托类型的功能被标记为过时(obsolete),因为更好的做法是在接口外部定义委托类型。对于C# 7.3,虽然你可以在接口中定义委托类型,但建议的做法是将其放在接口外部。
定义事件
在C# 7.3中,接口可以声明事件,但事件的实现(即添加和移除事件处理程序的方法)必须在实现接口的类中提供。接口只能声明事件的类型和名称。
public interface IMyInterface
{// 在接口中声明事件event MyDelegate MyEvent;
}// 假设MyDelegate是在接口外部定义的,或者按照上面的方式在接口内部定义(尽管不推荐)
// public delegate void MyDelegate(string message);public class MyClass : IMyInterface
{// 提供事件的具体实现public event MyDelegate MyEvent;// 触发事件的方法protected virtual void OnMyEvent(string message){MyEvent?.Invoke(message);}// 其他实现接口的方法...
}
在这个例子中,IMyInterface
接口声明了一个名为MyEvent
的事件,该事件使用MyDelegate
委托类型。MyClass
类实现了IMyInterface
接口,并提供了MyEvent
事件的具体实现,包括一个用于触发事件的方法OnMyEvent
。
解决办法:定义委托在接口外部就可以了。
public delegate void ExceptionHappenedEventHandler(object sender, ClassDeviceException de);
总结
- 在C# 7.3中,接口可以声明委托类型和事件,但委托类型的定义通常建议放在接口外部。
- 事件的实现(添加和移除事件处理程序)必须在实现接口的类中提供。
- 接口只能声明事件的类型和名称,不能提供事件的具体实现。