Вложенная функция не имеет той же подписи, что и делегат

#vb.net

#vb.net

Вопрос:

Я пытаюсь добиться эффекта, подобного каррированию, в VB. Я хочу иметь возможность это сделать:

 Dim wrap = WrapNumber("-")
wrap(5) 'returns "-5-"
  

Вот моя функция:

 Private Function WrapNumber(ByVal separator As String) As Func(Of Integer, String)

    Return Function(ByRef number As Integer) As String
               Return separator   number   separator
           End Function

End Function
  

Я получаю сообщение об ошибке в Return строке с этим сообщением:

Вложенная функция не имеет той же подписи, что и делегат Func(Of Integer, String)

Я не уверен, почему я получаю эту ошибку. Функция WrapNumber возвращает функцию, которая принимает Integer и возвращает a String , поэтому, насколько я вижу, она имеет тот же тип, Func что и указанный в WrapNumber подписи.

Комментарии:

1. Просто плевок, но я уверен ByRef , что это вызывает ваши проблемы. Func не поддерживает аргументы ByRef .

2. Удалите ByRef и amp; не используйте

Ответ №1:

Если вы включите опцию Strict , она покажет вам многое из того, что происходит не так. В дополнение к тому, что ByRef не требуется, как указано в комментариях, конкатенация пытается обработать разделитель как double . Если вы внесете эти изменения, то все будет работать нормально:

 Dim wrap = WrapNumber("-")
Dim test As String = wrap(5)
'test is equal to "-5-"

Private Function WrapNumber(ByVal separator As String) As Func(Of Integer, String)
    Return Function(number As Integer) As String
               Return separator amp; number.ToString amp; separator
           End Function
End Function
  

Комментарии:

1. Вы также можете удалить внешнюю ByVal функцию (по крайней мере, для согласованности). То же самое для ToString it строго не требуется