Какая версия C# перестала требовать явной реализации защищенных элементов интерфейса?

В C# 8 интерфейсы были обновлены, чтобы, помимо других модификаторов доступа, разрешить использование членов protected. В то время классы реализации должны были явно реализовывать такие члены интерфейса.

Итак, в C# 8 этот код:

public interface IFoo
{
    protected void Method();
}

public class Foo : IFoo
{
    public void Method()
    {
    }
}

выдает эту ошибку компиляции: protected

В последнее время я не писал кода, который бы использовал эту «функцию» (принудительное сокрытие вспомогательных методов, специфичных для реализации, от обычного публичного доступа), но недавно я заметил, что явная реализация больше не требуется. Приведенный выше фрагмент кода теперь компилируется без проблем (по крайней мере, начиная с C# 11). Почему/когда это изменилось? Я не смог найти никакой документации или обсуждения изменения. Это произошло случайно из-за других языковых изменений?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Эта функция называется «методы интерфейса по умолчанию», и вы можете узнать больше о ней в этой статье: Обновите интерфейсы с помощью методов интерфейса по умолчанию.

Это действительно была функция, реализованная, среди прочего, для большей гибкости языка. На странице Основы вы можете увидеть, что в разделе «Интерфейсы» они объясняют то же самое:

Начиная с C# 8.0, интерфейс может определять реализации по умолчанию. для некоторых или всех его членов. Класс или структура, реализующая интерфейс не должен реализовывать члены, имеющие значение по умолчанию реализации.

Ни одна из ваших ссылок ничего не говорит о ключевом слове protected.

Sir Rufo 20.08.2024 01:57

Я знаю методы интерфейсов по умолчанию. Я спрашиваю об этой более конкретной «функции» и о том, что с ней случилось: jeremybytes.blogspot.com/2019/11/… Раздел: Защищенные элементы интерфейса должны быть реализованы явно

Mars 20.08.2024 02:08
Ответ принят как подходящий

В C#8 было принято решение разрешать только явные реализации. Доступные опции заключались в ограничении использования protected для упрощения совместимости с будущими изменениями языка. Или вообще запретите использование protected.

Это ограничение было позже смягчено . Я бы посчитал как первоначальную реализацию, так и последующие изменения компилятора roslyn «неопределенным поведением». Поскольку я не верю, что спецификация языка C# определяет, каким должно быть поведение.

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