#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 вы не можете указать имя функции, чтобы передать ее таким образом.
Ответ №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)
. Ответ Андрея выше правильный.