Можно ли перевести следующий код С# в VB.NET, используя VB 9.0?
delegate Stream StreamOpenerDelegate(String name);
void Exec1()
{
WorkMethod( x => File.OpenRead(x));
}
void Exec2()
{
StreamOpenerDelegate opener = x => return File.OpenRead(x) ;
WorkMethod(opener);
}
Могу ли я сделать что-то вроде этого?:
Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream
Private Sub WorkMethod(ByVal d As StreamOpenerDelegate)
''
End Sub
Private Sub Exec1()
Me.WorkMethod(Function (ByVal x As String)
Return File.OpenRead(x)
End Function)
End Sub
Private Sub Exec2()
Dim opener As StreamOpenerDelegate = Function (ByVal x As String)
Return File.OpenRead(x)
End Function
Me.WorkMethod(opener)
End Sub
Я пытаюсь написать документацию, но не знаю синтаксиса VB. Часто я использую Reflector для его перевода, но я не уверен, что он работает в этот случай. Я также не понимаю, где мне понадобятся символы продолжения строки.
ОТВЕТ
В VB9 невозможно иметь многострочные лямбда-выражения (или суб-лямбда-выражения, о которых я не спрашивал). В VB9 все лямбды возвращают значение и должны быть одним выражением. Это меняется в VB10. VB10 допускает указанный выше синтаксис, а VB9 — нет. В VB9, если логика включает несколько строк кода, она не должна быть лямбдой; вы должны поместить его в именованную функцию и явно указать на нее. Как это:
Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream
Private Sub WorkMethod(ByVal d As StreamOpenerDelegate)
''
End Sub
Function MyStreamOpener(ByVal entryName As String) As Stream
'' possibly multiple lines here
Return File.OpenRead(entryName)
End Function
Private Sub Exec1()
Me.WorkMethod(AddressOf MyStreamOpener)
End Sub
сайт: Блог Майка Макинтайра