Можно ли внутри метода в C# объявить функцию с модификатором доступа protected?

«Можно ли внутри метода в C# объявить функцию с модификатором доступа protected?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это невозможно и вызовет ошибку компиляции.

Модификаторы доступа (public, private, protected, internal, protected internal) применяются только к членам класса или структуры (полям, свойствам, методам, вложенным классам).

Локальная функция, объявленная внутри метода, всегда имеет неявную приватную область видимости, ограниченную содержащим ее методом. Ей нельзя назначить какой-либо модификатор доступа.

Пример, который НЕ скомпилируется:

public class MyClass
{
    public void MyMethod()
    {
        // ОШИБКА CS0106: Модификатор "protected" недопустим для этого элемента
        protected void LocalFunction()
        {
            Console.WriteLine("Это невозможно");
        }
        LocalFunction();
    }
}

Правильное объявление локальной функции:

public void MyMethod()
{
    // Локальная функция без модификатора доступа (по умолчанию private)
    void CalculateAndPrint(int x, int y)
    {
        int result = x + y;
        Console.WriteLine(result);
    }

    CalculateAndPrint(5, 3); // Вызов внутри метода
}
// CalculateAndPrint() НЕВИДИМА за пределами MyMethod

Если нужна функция с доступом protected: Ее необходимо объявить как метод класса, а не внутри другого метода.

public class MyBaseClass
{
    // Этот метод доступен внутри MyBaseClass и в любых производных классах
    protected void HelperMethod()
    {
        Console.WriteLine("Защищенный метод-помощник");
    }

    public void PublicApiMethod()
    {
        // Можно вызвать защищенный метод внутри публичного
        HelperMethod();
        // ... и также использовать локальные функции для внутренней логики
        void LocalUtility() { /* ... */ }
    }
}

public class MyDerivedClass : MyBaseClass
{
    public void AnotherMethod()
    {
        HelperMethod(); // Корректно: доступен в производном классе
    }
}

Итог: Модификаторы доступа управляют видимостью между классами и сборками. Видимостью внутри метода управляет только его внутренняя логика и вложенные области видимости (блоки { }).