从接口方法的默认实现触发事件导致编译时错误

问题描述 投票:0回答:1

我正在尝试使用 .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 -=.

这个问题不是关于使用上下文是否合适,而是为什么不允许触发事件。我知道默认实现是为了互操作性而设计的,尽管经常为了方便而使用。然而,除了默认实现允许执行的所有操作之外,为什么不触发事件呢?如果允许这样做,是否会出现不良情况?我不确定我的问题标题措辞是否恰当。

c# .net events interface default-implementation
1个回答
0
投票

主要原因是接口中不允许使用实例字段,请参阅接口关键字

事件类似于自动实现的属性,由私有委托字段和包含添加和删除方法的事件定义组成 因此,要调用事件,实际上是调用委托字段。

因为接口定义中没有该私有字段,所以你也无法调用它。

但是允许使用静态字段,因此您可以在接口中调用静态事件。

© www.soinside.com 2019 - 2024. All rights reserved.