0

我不知道这是否有多大意义,我只是在试验一些东西来扩展我的知识(这并不多)。

是否可以将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”不是委托类型。

更新:

我正在尝试遵循@大师灯西欢的指示,但是这个类给了我一个编译器异常InvalidOperationException,它说值不能为空(什么值!?)

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
4

2 回答 2

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接受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
于 2013-10-22T11:53:57.893 回答
1

LambdaExpression 不是 lambda。它是一个表达式,在处理时将创建一个 lambda。任何类型的表达式都是如此,而不仅仅是 lambda 表达式。检查为什么要使用 Expression> 而不是 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);
于 2013-10-22T11:58:31.153 回答