2010-05-07 132 views
4

Am vb.net新手上路。這個問題可能非常新手,之前回答,但我找不到。我正在嘗試lambda功能,並在這裏觸及。Vb.Net行動委託問題?

Private Function HigerOrderTest(highFunction as Func(Of Int16,Int16)) As Action(of String) 
    Dim sam = highFunction(3)  
    Dim DoIt as Action(of String) 
    DoIt = sub(s) console.WriteLine(s)    
    return DoIt 
End Function 

我得到「預計表達式」。在線DoIt = sub(s)console.WriteLine(s)。當我改變這個DoIt = function(s)console.WriteLine(s)我得到了表達式不會產生一個值。錯誤。有什麼問題?

+0

是什麼版本的VB.NET你在用嗎? – 2010-05-07 07:09:09

+0

http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach – 2011-03-30 17:14:42

回答

7

如果您使用的是Visual Studio 2008(VB.NET 9),VB.NET中存在一個限制,它要求lambda表達式返回一個值,因此您不能使用Sub。這在VB.NET 10中已經改變了,所以在那個環境下你的代碼應該按照預期工作。

問題是,一方面你需要將你的lambda表達式變成Function而不是Sub,而另一方面Console.WriteLine沒有返回值。解決的辦法是包裝成調用Console.WriteLine功能這會返回一個值:

Private Function ConsoleWriteLine(ByVal text As String) As String 
    Console.WriteLine(text) 
    Return text 
End Function 

然後你可以使用該功能在您的lambda表達式:

Dim DoIt As Action(Of String) 
DoIt = Function(s) ConsoleWriteLine(s) 
+0

是的,上午使用VB 9.但我試着用功能,而不是Sub,那也不工作...拋出「表達式不會產生一個值」的錯誤... – RameshVel 2010-05-07 07:39:43

+0

@Ramesh:看到更新的答案 – 2010-05-07 08:05:01

+0

我明白了..謝謝.. :) – RameshVel 2010-05-07 09:51:52