我不知道这是否有多大意义,我只是在尝试扩展我的知识(这并不多)。
是否可以将Lambda
表达式存储到变量中以供以后使用?
这是我尝试过的:
Private t As Thread = New Thread(ThreadLambda)
Dim ThreadLambda As Expressions.LambdaExpression = _
Sub()
If tb2.InvokeRequired Then
tb2.BeginInvoke(Sub() tb2.Text = tb1.Text)
Else
tb2.Text = tb1.Text
End If
End Sub
启动此例外:
Lambda表达式无法转换为 'System.Linq.Expressions.LambdaExpression'因为 'System.Linq.Expressions.LambdaExpression'不是委托类型。
更新:
我正在尝试关注@大师灯Xi Huan指令,但是这个类给了我InvalidOperationException
的编译器异常,它说该值不能为null(什么值!?)
Public Class Form1
Private t As Threading.Thread = New Threading.Thread(ThreadLambda)
Dim ThreadLambda As Threading.ThreadStart = _
Sub()
For x = 0 To 10 : Debug.WriteLine("test") : Next
End Sub
End Class
答案 0 :(得分:1)
System.Linq.Expressions.LambdaExpression
是“普通”类型,而不是委托类型;但您可以使用System.Action
,这是一种委托类型:
Dim ThreadLambda As Action = _
Sub()
If tb2.InvokeRequired Then
tb2.BeginInvoke(Sub() tb2.Text = tb1.Text)
Else
tb2.Text = tb1.Text
End If
End Sub
Action
匹配您的lambda,因为它不接受参数,并且不返回值。
如果您想使用Thread
constructor that accepts an parameter委托类型的ThreadStart
,请使用ThreadStart
代替Action
:
Dim ThreadLambda As ThreadStart = _
Sub()
If tb2.InvokeRequired Then
tb2.BeginInvoke(Sub() tb2.Text = tb1.Text)
Else
tb2.Text = tb1.Text
End If
End Sub
答案 1 :(得分:1)
LambdaExpression不是lambda。它是一个表达式,在处理时,将创建一个lambda。任何类型的表达式都是如此,而不仅仅是lambda表达式。请查看Why would you use Expression> rather than Func?了解更多信息。
Lambda的实际类型是Action<>或Func<>,具体取决于它是否返回结果。其余的类型参数是lambda的参数。
因此,例如,这会创建一个添加到数字的lambda函数:
Func<int,int,int> f= (a,b)=>a+b;
var res1=f(5,4);
var res2=f(3,7);
虽然这会创建一个写入控制台的lambda:
Action<string> g= (txt)=>Console.WriteLine(txt);
g("This is a message);
顺便说一下,您应该考虑使用较新的Task方法来运行lambda而不是裸线程,例如:
Task.Run(theLambda);