В C# 8 интерфейсы были обновлены, чтобы, помимо других модификаторов доступа, разрешить использование членов protected
. В то время классы реализации должны были явно реализовывать такие члены интерфейса.
Итак, в C# 8 этот код:
public interface IFoo
{
protected void Method();
}
public class Foo : IFoo
{
public void Method()
{
}
}
выдает эту ошибку компиляции:
protected
В последнее время я не писал кода, который бы использовал эту «функцию» (принудительное сокрытие вспомогательных методов, специфичных для реализации, от обычного публичного доступа), но недавно я заметил, что явная реализация больше не требуется. Приведенный выше фрагмент кода теперь компилируется без проблем (по крайней мере, начиная с C# 11). Почему/когда это изменилось? Я не смог найти никакой документации или обсуждения изменения. Это произошло случайно из-за других языковых изменений?
Эта функция называется «методы интерфейса по умолчанию», и вы можете узнать больше о ней в этой статье: Обновите интерфейсы с помощью методов интерфейса по умолчанию.
Это действительно была функция, реализованная, среди прочего, для большей гибкости языка. На странице Основы вы можете увидеть, что в разделе «Интерфейсы» они объясняют то же самое:
Начиная с C# 8.0, интерфейс может определять реализации по умолчанию. для некоторых или всех его членов. Класс или структура, реализующая интерфейс не должен реализовывать члены, имеющие значение по умолчанию реализации.
Я знаю методы интерфейсов по умолчанию. Я спрашиваю об этой более конкретной «функции» и о том, что с ней случилось: jeremybytes.blogspot.com/2019/11/… Раздел: Защищенные элементы интерфейса должны быть реализованы явно
В C#8 было принято решение разрешать только явные реализации. Доступные опции заключались в ограничении использования protected
для упрощения совместимости с будущими изменениями языка. Или вообще запретите использование protected
.
Это ограничение было позже смягчено . Я бы посчитал как первоначальную реализацию, так и последующие изменения компилятора roslyn «неопределенным поведением». Поскольку я не верю, что спецификация языка C# определяет, каким должно быть поведение.
Ни одна из ваших ссылок ничего не говорит о ключевом слове
protected
.