Устранение ошибок и предупреждений, связанных с локальными функциями

В этой статье рассматриваются следующие ошибки и предупреждения компилятора:

  • CS8108: Не удается передать аргумент с динамическим типом параметру params «parameter» локальной функции «method».
  • CS8112: Локальная функция 'method' должна иметь тело, так как она не помечена как static extern.
  • CS8321: локальная функция "метод" объявлена, но никогда не используется
  • CS8421: Статическая локальная функция не может содержать ссылку на «variable».
  • CS8422: Статическая локальная функция не может содержать ссылку на "this" или "base".

Локальные функции добавлены в C# 7.0. Они позволяют объявлять вспомогательные методы внутри другого элемента. Диагностические сообщения в этой статье охватывают объявления, вызовы и использование локальных функций, а также дополнительные ограничения на захват для локальных функций static.

Тела локальных функций

  • CS8112: Локальная функция 'method' должна иметь тело, так как она не помечена как 'static extern'.

Объявление локальной функции должно иметь тело, если только локальная функция не объявлена как static extern. Добавьте блоковый текст или текст выражения в локальную функцию. Если реализация предоставляется внешне, пометьте локальную функцию static extern и убедитесь, что объявление соответствует правилам внешних методов.

Параметры params и динамические аргументы

  • CS8108: не удается передать аргумент с динамическим типом параметру params "parameter" локальной функции method.

Локальный dynamic вызов функции не может передать аргумент параметру params . Преобразуйте значение в тип элемента или тип массива, ожидаемый params параметром перед вызовом. Вы также можете хранить значения в явно типизированном массиве и передавать этот массив в локальную функцию.

Неиспользуемые локальные функции

  • CS8321: локальная функция "метод" объявлена, но никогда не используется

Компилятор сообщает об этом предупреждении, когда вы объявляете локальную функцию, но она не вызывается ни из какого исполняемого кода. Удалите неиспользуемую локальную функцию или вызовите ее из включающего элемента. Если вы планируете использовать локальную функцию в одном из будущих изменений, не добавляйте её в исходный код, пока она не понадобится.

Статические локальные функции не могут записывать состояние

  • CS8421: Статическая локальная функция не может содержать ссылку на "variable".
  • CS8422: Статическая локальная функция не может содержать ссылку на "this" или "base".

Локальнаяstatic функция не может захватывать состояние из внешней области видимости. Нельзя обращаться к локальным переменным внешней области видимости, параметрам и членам экземпляра через this или сам this. Передайте каждое значение локальной функции в качестве параметра (CS8421, CS84222). Если локальная функция должна записывать переменные или состояние экземпляра из включающей области, удалите static модификатор.

В следующем примере показаны ссылки, вызывающие CS8422:

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

Чтобы исправить CS8422, передайте необходимые данные экземпляра в локальную функцию, переместите вспомогательную функцию за пределы контекста экземпляра или удалите static, если локальная функция должна получать доступ к состоянию экземпляра.