Почему лямбда-выражения в VB отличаются от C #?

я только что обнаружил ошибку в NHibernate, которая, как оказалось, уже возникла: https://nhibernate.jira.com/browse/NH-2763

Я не уверен, относится ли это к чему-либо еще, кроме перечислений, но при использовании лямбда из VB он выглядит иначе, чем тот же лямбда из C #.

C #:

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

VB

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

Насколько я знаю, они такие же? (Мой VB не очень хорош)

Если я поставлю точку останова на той же строке кода, куда передается приведенный выше код. В C # я получаю:

C# version

В той же строке, когда передается версия VB, я получаю:

VB version

Я что-то делаю неправильно? Результат такой же, просто отображается по-разному в C # / VB?

Изменить: Хорошо, поэтому они отображаются по-разному, но они не могут быть одинаковыми, потому что NHibernate не может с этим справиться. Версия C # прекрасно обрабатывается NHibernate, версия VB разрешается в следующем исключении:

Exception

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.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

Значит, что-то должно отличаться между ними?

Редактировать 2:

Для Джонатан. Это метод, в котором используется выражение:

public IEnumerable GetByEntityId(long entityId, Expression> basicCriteria)
{
    IEnumerable result;

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

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

        result = employeeQuery.List();

        tx.Commit();
    }

    return result;
}

11
задан Gabe 19 July 2011 в 10:32
поделиться