Базовый синтаксис / явные вызовы реализаций интерфейса по умолчанию в 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));
}
}