Est-il possible de traduire le code C# suivant en VB.NET, en utilisant VB 9.0?Quel est l'équivalent VB de cette syntaxe C#, traitant des délégués?
delegate Stream StreamOpenerDelegate(String name);
void Exec1()
{
WorkMethod(x => File.OpenRead(x));
}
void Exec2()
{
StreamOpenerDelegate opener = x => return File.OpenRead(x) ;
WorkMethod(opener);
}
Puis-je faire quelque chose comme ça ?:
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
Je suis en train d'écrire de la documentation, mais je ne sais pas la syntaxe VB. Souvent, j'utilise Reflector pour le traduire, mais je ne suis pas sûr que cela fonctionne dans ce cas. Je ne suis pas clair sur où j'aurais besoin de caractères de continuation de ligne.
RÉPONSE
Dans VB9, il est impossible d'avoir lambdas plusieurs lignes (ou sous lambdas, que je ne l'ai pas poser des questions sur). Dans VB9, tous les lambdas renvoient une valeur et doivent être une seule expression. Cela change dans VB10. VB10 autorisera la syntaxe ci-dessus, mais pas VB9. En VB9, si la logique implique plusieurs lignes de code, elle ne doit pas être un lambda; vous devez le mettre dans une fonction nommée et le référencer explicitement. Comme ceci:
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
site: Mike McIntyre's blog
Eh bien, je ne pouvais pas faire plus que de demander à Reflector ici aussi. Et c'est assez bon pour traduire des syntaxes :-) – Joey