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

Существует несколько ошибок, связанных с объявлением и использованием лямбда-выражений :

  • CS0748: несогласованное использование лямбда-параметра; типы параметров должны быть явными или неявными.
  • CS1621: оператор получения не может использоваться внутри анонимного метода или лямбда-выражения.
  • CS1628: не удается использовать inref или out параметр внутри анонимного метода, лямбда-выражения или выражения запроса.
  • CS1632: элемент управления не может оставить текст анонимного метода или лямбда-выражения.
  • CS1673: анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра этого элемента.
  • CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
  • CS1706: выражение не может содержать анонимные методы или лямбда-выражения.
  • CS8030: Анонимная функция, преобразованная в пустоту возвращающего делегата, не может возвращать значение.
  • CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.
  • CS8916: атрибуты для лямбда-выражений требуют списка параметров с скобками.
  • CS8971: ИнтерполированныйStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться на сайте вызова.
  • CS8975: контекстное ключевое слово var нельзя использовать в качестве явного лямбда-возвращаемого типа.
  • CS9098: неявно типизированный лямбда-параметр "..." не может иметь значение по умолчанию.

Кроме того, существует несколько предупреждений, связанных с объявлением и использованием лямбда-выражений :

  • CS8971: ИнтерполированныйStringHandlerArgument не действует при применении к лямбда-параметрам и будет игнорироваться на сайте вызова.
  • CS9099: значение параметра по умолчанию не совпадает в целевом типе делегата.
  • CS9100: параметр имеет модификатор парам в лямбда-коде, но не в целевом типе делегата.

Ограничения синтаксиса в лямбда-выражениях

Некоторые синтаксис C# запрещены в лямбда-выражениях и анонимных методах. Использование недопустимых конструкций в лямбда-выражении приводит к следующим ошибкам:

  • CS1621: yield оператор нельзя использовать внутри анонимного метода или лямбда-выражения.
  • CS1628: не удается использовать inили outrefпараметр внутри анонимного метода, лямбда-выражения или выражения запроса.
  • CS1632: элемент управления не может оставить текст анонимного метода или лямбда-выражения.
  • CS1673: анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра this.
  • CS1686: локальная переменная или ее члены не могут принимать свой адрес и использоваться внутри анонимного метода или лямбда-выражения.
  • CS8175: не удается использовать ref local внутри анонимного метода, лямбда-выражения или выражения запроса.

Все следующие конструкции запрещены в лямбда-выражениях:

  • yield операторы (yield return или yield break)
  • Вызов метода с параметром , refили out параметром in
  • ref локальные переменные
  • break, и gotocontinue операторы
  • 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) => { };