Linq выбирает компиляцию по-разному между C # и VB

#c# #vb.net #linq

#c# #vb.net #linq

Вопрос:

У меня есть следующий код на C #, который компилируется правильно:

 private string formatterCSharp(int number)
{
    return "n"   number;
}

private void testInCSharp()
{
    IEnumerable<int> list = new List<int>();

    IEnumerable<string> formatted = list.Select(formatterCSharp);
}
  

Как вы можете видеть, formatted должно содержать содержимое list , с formatterCSharp применением к каждому.

Когда я пытаюсь воспроизвести этот код в VB, я получаю следующее:

 Private Function formatterVisualBasic(ByVal number As Integer) As String
    Return "n"   number
End Function

Private Sub testInVB()
    Dim list As IEnumerable(Of Integer) = New List(Of Integer)

    Dim formatted As IEnumerable(Of String) = list.Select(formatterVisualBasic)
End Sub
  

Однако я получаю две ошибки компиляции в Select инструкции в VB.

 BC30455
    Argument not specified for parameter 'number' of 'Private Function formatterVisualBasic(number As Integer) As String'.

BC30518
    Overload resolution failed because no accessible '[Select]' can be called with these arguments:
        Extension method 'Public Function [Select](Of TResult)(selector As Func(Of Integer, TResult)) As IEnumerable(Of TResult)' defined in 'Enumerable': Type parameter 'TResult' cannot be inferred.
        Extension method 'Public Function [Select](Of TResult)(selector As Func(Of Integer, Integer, TResult)) As IEnumerable(Of TResult)' defined in 'Enumerable': Type parameter 'TResult' cannot be inferred.
  

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

1. Вот правильное исправление: Dim отформатирован как IEnumerable(из строки) = list . Выберите(Function(x) formatterVisualBasic(x))

Ответ №1:

Попробуйте

 Dim formatted As IEnumerable(Of String) = list.Select(AddressOf formatterVisualBasic)
  

В VB.net вы не можете указать имя функции, чтобы передать ее таким образом.

https://msdn.microsoft.com/en-us/library/y72ewk2b.aspx

Ответ №2:

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

     Dim formatted As IEnumerable(Of String) = list.Select(Function(x As String) x = formatterVisualBasic(mynumber))
  

Во-вторых, если вы хотите получить то же исключение, что и в вашем коде на C #, вы должны добавить круглые скобки к формату вызова функции formatterVisualBasic, чтобы он распознался как функция

     Dim formatted As IEnumerable(Of String) = list.Select(Function(x As String) x = formatterVisualBasic())
  

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

1. Это не тот синтаксис, который я ищу. Я не хочу делать Select(Function(x) someFunction(X) , я только хочу делать Select(someFunction) . Ответ Андрея выше правильный.