将Lambda表达式存储到变量中?

时间:2013-10-22 11:50:57

标签: .net vb.net variables lambda expression

我不知道这是否有多大意义,我只是在尝试扩展我的知识(这并不多)。

是否可以将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

2 个答案:

答案 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);