Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Существует несколько ошибок, связанных с объявлением и использованием лямбда-выражений:
- CS0748: несогласованное использование лямбда-параметра; типы параметров должны быть явными или неявными.
- CS1621: Оператор yield не может использоваться внутри анонимного метода или лямбда-выражения.
-
CS1628: не удается использовать
inrefилиoutпараметр внутри анонимного метода, лямбда-выражения или выражения запроса. - CS1632: управление не может покинуть тело анонимного метода или лямбда-выражения.
- CS1673: анонимные методы, лямбда-выражения и выражения запросов в структурах не могут получить доступ к членам экземпляра this.
- CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
- CS1706: выражение не может содержать анонимные методы или лямбда-выражения.
- CS8030: Анонимная функция, преобразованная в делегат, возвращающий void, не может возвращать значение.
- CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.
- CS8916: атрибуты для лямбда-выражений требуют списка параметров с скобками.
- CS8971: InterpolatedStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться в точке вызова.
-
CS8975: контекстное ключевое слово
varнельзя использовать в качестве явного лямбда-возвращаемого типа. - CS9098: неявно типизированный лямбда-параметр "..." не может иметь значение по умолчанию.
Кроме того, существует несколько предупреждений , связанных с объявлением и использованием лямбда-выражений:
- CS8971: InterpolatedStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться в месте вызова.
- CS9099: значение параметра по умолчанию не совпадает в целевом типе делегата.
- CS9100: параметр имеет модификатор 'params' в лямбда-выражении, но не в целевом типе функции-делегата.
Компилятор также создает следующее информационное сообщение:
- CS9236: компиляция требует привязки лямбда-выражения по крайней мере количества раз. Рассмотрите возможность объявления лямбда-выражения с явными типами параметров или если вызов содержащего метода является универсальным, рассмотрите возможность использования явных аргументов типа.
Ограничения синтаксиса в лямбда-выражениях
Некоторые конструкции C# запрещены в лямбда-выражениях и анонимных методах. Использование недопустимых конструкций в лямбда-выражении приводит к следующим ошибкам:
-
CS1621:
yieldоператор нельзя использовать внутри анонимного метода или лямбда-выражения. -
CS1628: не удается использовать
inилиrefoutпараметр внутри анонимного метода, лямбда-выражения или выражения запроса. - CS1632: элемент управления не может оставить текст анонимного метода или лямбда-выражения.
-
CS1673: анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра
this. - CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
- CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.
Все следующие конструкции запрещены в лямбда-выражениях:
-
yieldвыражения (yield returnилиyield break) - Вызов метода с параметром
in,refилиout. -
refлокальные переменные -
break, иgotocontinueоператоры - доступ к
this, еслиthisявляется типомstruct - Анонимные методы или лямбда-выражения внутри другого выражения, например конструктор атрибутов.
Вы не можете использовать какие-либо из этих конструкций в лямбда-выражении или анонимном методе. Многие из них разрешены в локальной функции.
Кроме того, интерполированные типы обработчиков строк игнорируются при применении к лямбда-параметру. Если вы используете его, вы увидите следующее предупреждение:
- CS8971: InterpolatedStringHandlerArgument не влияет при применении к параметрам лямбда-функций и будет игнорироваться в точке вызова.
Некоторые выражения приводят к тому, что компилятор выдает следующее информационное предупреждение:
- CS9236: компиляция требует привязки лямбда-выражения по крайней мере количества раз. Рассмотрите возможность объявления лямбда-выражения с явными типами параметров или если вызов содержащего метода является универсальным, рассмотрите возможность использования явных аргументов типа.
Сложность лямбда-выражений и их вызов других лямбда-выражений отрицательно влияет на производительность компилятора. Причина заключается в том, что компилятору приходится выводить типы параметров и аргументов через лямбда-выражения, и процесс определения потенциальных типов занимает время.
Параметры лямбда-выражения и возвращаемое значение
Эти ошибки указывают на проблему с объявлением параметров:
- CS0748: несогласованное использование лямбда-параметра; типы параметров должны быть явными или неявными.
- CS9098: неявно типизированный лямбда-параметр "..." не может иметь значение по умолчанию.
- CS8030: Анонимная функция, преобразованная в делегат, не возвращающий значение, не может возвращать значение.
- CS8916: атрибуты для лямбда-выражений требуют списка параметров с скобками.
- CS8975: контекстное ключевое слово var нельзя использовать в качестве явного лямбда-возвращаемого типа.
Параметры лямбда-выражения должны соответствовать этим правилам:
- Если лямбда-выражение имеет несколько параметров, все параметры должны быть явно типизированными или все параметры должны быть неявно типизированными.
- Все лямбда-параметры со значением по умолчанию должны быть явно типизированными.
- Если атрибуты применяются к любым параметрам, список параметров должен быть заключен в скобки.
Возвращаемые типы лямбда-выражения должны соответствовать этим правилам:
- Лямбда-выражение, возвращающее любое значение, не может быть преобразовано в делегат, возвращающий
void, такой какAction. - Тип возвращаемого значения либо выводится, либо является явным типом. Тип возвращаемого значения, объявленный с помощью ключевого слова
var, не разрешен.
Тип делегата лямбда-выражения
- CS9099: предупреждение: значение параметра по умолчанию не соответствует типу целевого делегата.
При объявлении значения по умолчанию или добавлении params модификатора с параметром лямбда-выражения тип делегата не является одним из Func или Action типов. Скорее, это пользовательский тип, включающий значение параметра по умолчанию или params модификатор. Следующий код создает предупреждения, так как он назначает лямбда-выражение, которое имеет параметр Action по умолчанию для типа:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Чтобы устранить ошибку, удалите параметр по умолчанию или используйте неявно типизированные переменные для типа делегата.
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };