为什么在VB lambda表达式从C#有什么不同? [英] Why do lambda expressions in VB differ from C#?

查看:359
本文介绍了为什么在VB lambda表达式从C#有什么不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


HTTPS:

我只是碰到NHibernate的恰好已经筹集的错误来了://nhibernate.jira.com/browse/NH-2763



我不知道,如果这当使用适用于别的以外枚举,但从VB的lambda,它看起来与C#相同的LAMBDA不同



C#:

 其中(x => x.Status == EmployeeStatus.Active)

VB

 凡(功能(X)= x.Status EmployeeStatus.Active)

他们都是一样的,据我所知? (我的VB是不是很大)



如果我把一个破发点在同一行的代码,其中上面的代码被传入。在C#中我得到:





在同一行的时候VB版本中传递,我得到:





这是不是我做错了吗?是结果是一样的,只是显示的C#之间的不同/ VB



编辑:
好,以便​​显示不同,但它们不能是相同的,因为NHibernate的不能处理它。 C#的版本是由NHibernate的处理非常精细,VB版本以下异常解析被抛出:





NHibernate的堆栈跟踪:

 在NHibernate.Impl.ExpressionProcessor.FindMemberExpression(表达式表达式)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor.cs:168线
在NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(左表达,表达权,ExpressionType节点类型)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor。 CS:在NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression线323
(BinaryExpression定)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor.cs:线316
在NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression表达式)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor.cs:418线
在NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor.cs:行486
。在NHibernate.Impl.ExpressionProcessor.ProcessExpression [T](Expression`1表达式)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Impl\ExpressionProcessor.cs:行504
在NHibernate.Criterion.QueryOver`2.Add(Expression`1表达式)在d:\CSharp\NH\NH\\\
hibernate\src\NHibernate\Criterion\QueryOver.cs :在NHibernate.Criterion.QueryOver`2.NHibernate.IQueryOver<线635
; TRoot,TSubType>在ð。凡(Expression`1表达式):\CSharp\NH\NH\\\
hibernate\src \NHibernate\Criterion\QueryOver.cs:\ *删除* \EmployeeRepository.cs:在*删除* .EmployeeRepository.GetByEntityId(Int64的ENTITYID,Expression`1 basicCriteria)在D线686
线76

因此就必须在这两者之间有什么不同?



编辑2:



有关乔纳森。这是用来表达方法:

 公开的IEnumerable<员工> GetByEntityId(长ENTITYID,表达<&Func键LT;员工,布尔>> basicCriteria)
{
IEnumerable的<员工>结果;

使用(VAR TX = Session.BeginTransaction())
{
VAR employeeQuery = Session.QueryOver<员工>()
。凡(X => x.EntityId == ENTITYID);

如果(basicCriteria!= NULL)
employeeQuery = employeeQuery.Where(basicCriteria);

结果= employeeQuery.List();

tx.Commit();
}

返回结果;
}


解决方案

您所看到的差异有无关lambda表达式;它只是在语言的语义差别。 VB是发光调用功能,默认情况下抛出异常,如果一个整数溢出(因此经过名称的一部分)。



默认情况下,C#编译器不会发出检查功能的版本,显然NHibernate的是C#用户开发的,所以它似乎并不承认检查功能。



如果你去为你的项目的编译选项并单击高级编译选项,你可以勾选删除整数溢出检查框,以便VB具有默认的C#的行为,你不应该得到错误了:




I just came across a bug in NHibernate which happens to already be raised: https://nhibernate.jira.com/browse/NH-2763

I'm not sure if this applies to anything else other than enums but when using a Lambda from VB, it looks different to the same Lambda from C#.

C#:

Where(x => x.Status == EmployeeStatus.Active)

VB

Where(Function(x) x.Status = EmployeeStatus.Active)

They are the same as far as I'm aware? (My VB isn't great)

If I put a break point on the same line of code, where the above code is passed into. In C# I get:

On the same line when VB version is passed in, I get:

Is this something I'm doing wrong? Is the result's the same, just displayed different between C#/VB?

Edit: Ok so they are displayed different, but they can't be the same because NHibernate cannot handle it. The C# version is handled perfectly fine by NHibernate, the VB version resolves in the following exception being thrown:

The NHibernate StackTrace:

   at NHibernate.Impl.ExpressionProcessor.FindMemberExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 168
   at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 323
   at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(BinaryExpression be) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 316
   at NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 418
   at NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 486
   at NHibernate.Impl.ExpressionProcessor.ProcessExpression[T](Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 504
   at NHibernate.Criterion.QueryOver`2.Add(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 635
   at NHibernate.Criterion.QueryOver`2.NHibernate.IQueryOver<TRoot,TSubType>.Where(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 686
   at *removed*.EmployeeRepository.GetByEntityId(Int64 entityId, Expression`1 basicCriteria) in D:\*removed*\EmployeeRepository.cs:line 76

So something must be different between the two?

Edit 2:

For Jonathan. This is the method where the expression is used:

public IEnumerable<Employee> GetByEntityId(long entityId, Expression<Func<Employee, bool>> basicCriteria)
{
    IEnumerable<Employee> result;

    using (var tx = Session.BeginTransaction())
    {
        var employeeQuery = Session.QueryOver<Employee>()
                                    .Where(x => x.EntityId == entityId);

        if (basicCriteria != null)
            employeeQuery = employeeQuery.Where(basicCriteria);

        result = employeeQuery.List();

        tx.Commit();
    }

    return result;
}

解决方案

The difference you are seeing has nothing to do with lambdas; it is simply a difference in the semantics of the languages. VB is emitting calls to functions that by default throw exceptions if an integer overflows (hence the Checked part of the name).

By default the C# compiler does not emit the "checked" version of functions, and apparently NHibernate is developed by C# users, so it doesn't seem to recognize the "checked" functions.

If you go to the Compile options for your project and click on Advanced Compile Options, you can check the "Remove integer overflow checks" box so that VB has the default C# behavior and you shouldn't get that error anymore:

这篇关于为什么在VB lambda表达式从C#有什么不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆