我正在尝试default interface methods
在 .NET 9、C# 13 中使用该功能。
考虑以下界面:
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 -=.
这个问题不是关于使用上下文是否合适,而是为什么不允许触发事件。我知道默认实现是为互操作性而设计的,尽管通常是为了方便使用。但是,除了默认实现允许做的所有事情之外,为什么不触发事件呢?如果允许这样做,是否会出现不良情况?我不确定我是否恰当地措辞了问题标题。
主要原因是接口中不允许有实例字段,请参阅接口关键字。
事件类似于自动实现的属性,由私有委托字段和包含添加和删除方法的事件定义组成,因此,要调用事件,实际上是调用委托的 Invoke 方法。
因为接口定义中没有那个私有字段,所以你也不能调用它。
但是允许使用静态字段,因此您可以在接口中调用静态事件。