2010-10-05 41 views
4

我發現this answer在VS2010被實際發佈之前被問及回答。VB.NET和Visual Studio 2010支持多線匿名方法嗎?

他們說,

VB9只有單線匿名 功能。我們在VB10中添加了完整的聲明 和多行lambda表達式。

但是我還是

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) 
) 

將此代碼添加到一個.NET Framework 4.0的項目在Visual Studio 2010中,並沒有編譯。

你現在如果這個功能真的實現了,我做錯了什麼?

回答

11

我相信你只是想念你的'結束功能'一行。試試這個:

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

哦,謝謝!對不起,這個愚蠢的問題,今天在辦公室裏可能太熱了:D。 – Drake 2010-10-05 15:26:57

+0

哈哈!根本不傻!不是一個星期前,我遇到了同樣的問題。 – diceguyd30 2010-10-05 15:30:38

3

你缺少End Function和你正試圖包圍在括號中的函數體,這是不對的。這應該工作:

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 

此功能是記錄在這裏:

2

下面是一些你可能會發現有用。注意聲明的方法是如何被立即調用的。

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