Ошибки и предупреждения при использовании лямбда-выражений и анонимных функций
Существует несколько ошибок, связанных с объявлением и использованием лямбда-выражений :
- CS0748: несогласованное использование лямбда-параметра; типы параметров должны быть явными или неявными.
- CS1621: оператор получения не может использоваться внутри анонимного метода или лямбда-выражения.
- CS1628: не удается использовать
in
ref
илиout
параметр внутри анонимного метода, лямбда-выражения или выражения запроса. - CS1632: элемент управления не может оставить текст анонимного метода или лямбда-выражения.
- CS1673: анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра этого элемента.
- CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
- CS1706: выражение не может содержать анонимные методы или лямбда-выражения.
- CS8030: Анонимная функция, преобразованная в пустоту возвращающего делегата, не может возвращать значение.
- CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.
- CS8916: атрибуты для лямбда-выражений требуют списка параметров с скобками.
- CS8971: ИнтерполированныйStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться на сайте вызова.
- CS8975: контекстное ключевое слово
var
нельзя использовать в качестве явного лямбда-возвращаемого типа. - CS9098: неявно типизированный лямбда-параметр "..." не может иметь значение по умолчанию.
Кроме того, существует несколько предупреждений, связанных с объявлением и использованием лямбда-выражений :
- CS8971: ИнтерполированныйStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться на сайте вызова.
- CS9099: значение параметра по умолчанию не совпадает в целевом типе делегата.
- CS9100: параметр имеет модификатор парам в лямбда-коде, но не в целевом типе делегата.
Ограничения синтаксиса в лямбда-выражениях
Некоторые синтаксис C# запрещены в лямбда-выражениях и анонимных методах. Использование недопустимых конструкций в лямбда-выражении приводит к следующим ошибкам:
- CS1621:
yield
оператор нельзя использовать внутри анонимного метода или лямбда-выражения. - CS1628: не удается использовать
in
илиout
ref
параметр внутри анонимного метода, лямбда-выражения или выражения запроса. - CS1632: элемент управления не может оставить текст анонимного метода или лямбда-выражения.
- CS1673: анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра
this
. - CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
- CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.
Все следующие конструкции запрещены в лямбда-выражениях:
yield
операторы (yield return
илиyield break
)- Вызов метода с параметром ,
ref
илиout
параметромin
ref
локальные переменныеbreak
, иgoto
continue
операторыthis
доступ кthis
типуstruct
- Анонимные методы или лямбда-выражения внутри другого выражения, например конструктор атрибутов.
Вы не можете использовать какие-либо из этих конструкций в лямбда-выражении или анонимном методе. Многие из них разрешены в локальной функции.
Кроме того, интерполированные типы обработчиков строк игнорируются при применении к лямбда-параметру. Если вы используете его, вы увидите следующее предупреждение:
- CS8971: ИнтерполированныйStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться на сайте вызова.
Параметры лямбда-выражения и возвращается
Эти ошибки указывают на проблему с объявлением параметров:
- 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) => { };