我正在尝试使用 .NET 9、C# 13 中的
default interface methods
功能。
考虑以下界面:
public interface ICustomNotifyPropertyChanged:
INotifyPropertyChanged
{
public void OnPropertyChanged (string propertyName);
// Compiler Error: [CS0079].
//public void OnPropertyChanged (string propertyName)
// => this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T> (ref T field, T value, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<T>.Default.Equals(field, value)) { return (false); }
field = value;
this.OnPropertyChanged(propertyName);
return (true);
}
}
注意
OnPropertyChanged
的默认实现尝试如何导致以下错误:
CS0079: The event 'ICustomNotifyPropertyChanged.PropertyChanged' can only appear on the left hand side of += or -=.
这个问题不是关于使用上下文是否合适,而是为什么不允许触发事件。我知道默认实现是为了互操作性而设计的,尽管经常为了方便而使用。然而,除了默认实现允许执行的所有操作之外,为什么不触发事件呢?如果允许这样做,是否会出现不良情况?我不确定我的问题标题措辞是否恰当。
主要原因是接口中不允许使用实例字段,请参阅接口关键字。
事件类似于自动实现的属性,由私有委托字段和包含添加和删除方法的事件定义组成 因此,要调用事件,实际上是调用委托字段。
因为接口定义中没有该私有字段,所以你也无法调用它。
但是允许使用静态字段,因此您可以在接口中调用静态事件。