Базовый синтаксис / явные вызовы реализаций интерфейса по умолчанию в C# 8.0

Я возился с реализациями интерфейса по умолчанию. Решили, что вам нужно выполнить понижающее преобразование к типу интерфейса, чтобы использовать реализацию метода по умолчанию. Я также нашел кучу примечаний по другому синтаксису, я не могу найти, включен он уже или нет, я нашел "решения" о том, как он будет выглядеть, но это не работает. Я делаю это неправильно или этот новый синтаксис еще не включен?

В некоторой степени связано, но не отвечает на мой вопрос: вызов метода по умолчанию интерфейса С # из реализации структуры без бокса

Примечания к base<>/base()синтаксис: https://github.com/dotnet/csharplang/blob/master/meetings/2018/LDM-2018-11-14.md

Страница предложения Microsoft: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods

class D : IA, IB, IC
{
                  //Notice the use of base() right here.
    void IA.M() { base(IB).M(); }
}

Скажем, нам нужен INotifyPropertyChanged для некоторого объекта. Теперь у нас может быть реализация SetField по умолчанию для интерфейса:

public interface INotify : INotifyPropertyChanged
{
    void InvokePropertyChanged(string propertyName);

    bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        INotify thing = (INotify)this;

        if (propertyName == null)
        {
            throw new ArgumentException($"{nameof(propertyName)} is null. PropertyChangedEventHandler will not be fired correctly.");
        }

        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        InvokePropertyChanged(propertyName);
        return true;
    }
}

Реализация требует пониженного (((INotify)this).SetField), с помощью base(INotify) здесь будет предпочтительнее.

public class Thing : INotify
{
    public string A
    {
        get => _a;
        //Need an explicit cast here. Can't figure out how to use base syntax.
        set => ((INotify)this).SetField(ref _a, value);
    }
    private string _a;

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

0 ответов

Другие вопросы по тегам