谓词参数在C#中是如何在语法上工作的?

谓词参数在C#中是如何在语法上工作的?,c#,syntax,lambda,orm,llblgenpro,C#,Syntax,Lambda,Orm,Llblgenpro,一些对象关系映射(ORM)框架(如LLBLGen)允许您为查询方法指定“谓词”参数,例如(简化一点): 第二个参数在C#中的语法是如何工作的?它看起来有点像lambda表达式,但没有参数部分或“=>”。这是怎么一回事?这个可能需要Jon Skeet。如果您重载“”操作符以在特殊的“SuperDatabaseMapField”类型上返回某种谓词对象,您可以执行这些操作 这就是说,取而代之的是lambda表达式(如果必须的话,还可以解析表达式树),这在各方面似乎都要差得多。我同意mquander的回

一些对象关系映射(ORM)框架(如LLBLGen)允许您为查询方法指定“谓词”参数,例如(简化一点):

第二个参数在C#中的语法是如何工作的?它看起来有点像lambda表达式,但没有参数部分或“=>”。这是怎么一回事?这个可能需要Jon Skeet。

如果您重载“
”操作符以在特殊的“
SuperDatabaseMapField
”类型上返回某种谓词对象,您可以执行这些操作


这就是说,取而代之的是lambda表达式(如果必须的话,还可以解析表达式树),这在各方面似乎都要差得多。

我同意
mquander的回答。这种构造之所以有效,是因为编译器计算表达式的方式。在本例中,对于LLBLGen,第二个参数需要可以计算为布尔值的值(例如)

运算符(+、-、***、/)仅仅是编译器用于构建语法树的表达式,编译器使用这些语法树验证给定上下文(“+”)时左右表达式的某些组合是否有效。例如,
a
(字符串文字)+
2.4
(float)在C#中显然无效,编译器通过验证表达式(字符串)(运算符_添加)(float)知道这一点

因此,为了制作一个类似以下工作的奇怪场景:

FetchEntities(EntityType.Employee, 
    EmployeeFields.Salary > ((EmployeeFields.DateOfBirth - 10) * 1.2) + 1024)
必须重载运算符(-and***和+),以返回新的“谓词”对象

最终,这样一个语句将被翻译成以下语法树(为了回答这个问题,“()”中的项目是表达式类型)

这就是lambda表达式和fluent查询的工作原理。这一切归结为表达式求值


Lambda表达式更。。。其表现力在于,它们可以接触对象及其字段、属性和方法,并允许形成任意长度的语法树。

猜测一下,某种类型的运算符重载?是的,我始终认为,将运算符扭曲到这种程度通常会导致混乱,如OP所示。
FetchEntities(EntityType.Employee, 
    EmployeeFields.Salary > ((EmployeeFields.DateOfBirth - 10) * 1.2) + 1024)
(BinaryComparison)
    LeftSide: (Field_Reference)    --> EmployeeFields.Salary
    RightSide:
        (MathematicOperator)
            LeftSide:
                (MathematicOperator)
                    LeftSide: 
                        (MathematicOperator)
                            LeftSide: (Field_Reference)    --> EmployeeFields.DateOfBirth
                            RightSide: (constant)    --> 10
                            Operator:      --> -
                    RightSide: (constant)    --> 1.2
                    Operator:     --> ***
            RightSide: (constant)    --> 1024
            Operator:     --> +
    Operator:     --> >