2010-10-05 1 views
4

J'ai trouvé que this answer a été demandé et a répondu avant VS2010 a été réellement libéré.VB.NET et Visual Studio 2010 prennent-ils en charge la méthode anonyme multiligne?

Ils disent que

VB9 a seulement anonyme fonctions sur une seule ligne. Nous ajoutons la déclaration complète et lambdas multilignes dans VB10.

Mais j'ai essayé d'ajouter ce code

Dim test2 = Function(t1 As T, t2 As T) (
Dim val1 As IComparable = DirectCast(prop.GetValue(t1), IComparable) 
Dim val2 As IComparable = DirectCast(prop.GetValue(t2), IComparable) 
Return val1.CompareTo(val2) 
) 

à un .NET Framework 4.0 projet dans Visual Studio 2010 et il ne compile pas.

Avez-vous maintenant si cette fonctionnalité est vraiment mise en œuvre et ce que je fais mal?

Répondre

11

Je crois qu'il ne vous manque que votre ligne 'End Function'. Essayez ceci:

Dim test2 = (Function(t1 As T, t2 As T) 
Dim val1 As IComparable = DirectCast(prop.GetValue(t1), IComparable) 
Dim val2 As IComparable = DirectCast(prop.GetValue(t2), IComparable) 
Return val1.CompareTo(val2) 
End Function) 
+0

Oh, merci! Désolé pour la question idiote, il fait probablement trop chaud aujourd'hui au bureau: D. – Drake

+0

Haha! Pas bête du tout! J'ai rencontré exactement le même problème il n'y a pas une semaine. – diceguyd30

3

Il vous manque End Function et que vous essayez de joindre le corps de la fonction entre parenthèses, ce qui est faux. Cela devrait fonctionner:

Dim test2 = Function(t1 As T, t2 As T) 
    Dim val1 As IComparable = DirectCast(prop.GetValue(t1), IComparable) 
    Dim val2 As IComparable = DirectCast(prop.GetValue(t2), IComparable) 
    Return val1.CompareTo(val2) 
End Function 

Cette fonction est documentée ici:

2

Voici quelque chose que vous pourriez trouver utile. Notez comment la méthode déclarée est invoquée instantanément.

Dim food = New With { 
    .ID = 1, 
    .Name = "Carrot", 
    .Type = (
     Function(name As String) 
      If String.IsNullOrEmpty(name) Then Return String.Empty 

      Select Case name.ToLower() 
       Case "apple", "tomato": Return "Fruit" 
       Case "potato": Return "Vegetable" 
      End Select 

      Return "Meat" 
     End Function 
    )(.Name) 
} 
Dim type = food.Type