Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются следующие ошибки и предупреждения компилятора:
- 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, если локальная функция должна получать доступ к состоянию экземпляра.
Связанная диагностика
- Дополнительные сведения о локальных функциях в деревьях выражений см. в разделе Некоторые выражения запрещены в деревьях выражений в сообщениях компилятора C#.
- Дополнительные сведения о локальных функциях с параметрами универсального типа см. в разделе "Устранение ошибок и предупреждений, связанных с параметрами универсального типа и аргументами типа" в сообщениях компилятора C#.
- Дополнительные сведения об атрибутах локальных функций см. в статье "Устранение ошибок и предупреждений, связанных с объявлением атрибутов и использованием атрибутов в коде в сообщениях компилятора C#".
- Дополнительные сведения о захваченных переменных в анонимных функциях см. в ошибках и предупреждениях лямбда-выражений в сообщениях компилятора C#.
- Дополнительные сведения о захватах в конструкторах и первичных конструкторах см. в разделе «Устранение ошибок, связанных с объявлениями конструкторов и инициализаторами модулей» в сообщениях компилятора C#.