Функция Func (Of Tin, Tout), использующая лямбда-выражение с аргументом ByRef, выдает несовместимую ошибку подписи - PullRequest
9 голосов
/ 09 марта 2011

Почему это так:

Private [Function] As Func(Of Double, String) = Function(ByRef z As Double) z.ToString

выдает следующую ошибку:

Вложенная функция не имеет сигнатуры, совместимой с String делегата) '.

При этом:

Private [Function] As Func(Of Double, String) = Function(ByVal z As Double) z.ToString

Не?(Разница в ByRef / ByVal)

Кроме того, как я могу реализовать такую ​​вещь?

Ответы [ 2 ]

11 голосов
/ 09 марта 2011

Вы получаете эту ошибку, потому что тип делегата Функция (ByVal z As Double) As String не совместима с Function (ByRef z As Double) As String .Вам нужно точное совпадение.

Также нельзя объявить универсальный делегат Func (Of ...) с параметрами ByRef ( ref или out в C #), независимо от того, используете ли вы анонимную функцию или нет.

Но вы можете объявить свой тип делегата и затем использовать его даже с анонимной функцией

Delegate Function ToStringDelegate(ByRef value As Double) As String

Sub Main()
    Dim Del As ToStringDelegate = Function(ByRef value As Double) value.ToString()
End Sub

или можетеиспользовать неявную типизацию (если включена опция Option Infer)

Dim Del = Function(ByRef value As Double) value.ToString()
6 голосов
/ 09 марта 2011

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

  • Перехваченная переменная не будет собираться мусором до тех пор, пока делегат, ссылающийся на нее, не выйдет из области видимости.
  • Переменные, введенные в лямбда-выражении, не видны во внешнем методе.
  • Лямбда-выражение не может напрямую захватывать параметр ref [ByRef in VB] или out из метода вложения.
  • Оператор return в лямбда-выражении не приводит к возврату метода вложения.
  • Лямбда-выражение не может содержать оператор goto, оператор break или оператор continue, цель которого находится вне тела или в теле содержащейся анонимной функции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...