为什么 VB 中的 lambda 表达式与 C# 中不同?

2023-12-25

我刚刚在 NHibernate 中遇到了一个错误,该错误恰好已经被提出:https://nhibernate.jira.com/browse/NH-2763 https://nhibernate.jira.com/browse/NH-2763

我不确定这是否适用于枚举以外的其他任何东西,但是当使用 VB 中的 Lambda 时,它看起来与 C# 中的相同 Lambda 不同。

C#:

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

VB

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

据我所知,它们是一样的吗? (我的VB不太好)

如果我在传递上述代码的同一行代码上放置一个断点。在 C# 中我得到:

当传入 VB 版本时,在同一行,我得到:

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

Edit:好吧,它们显示不同,但它们不能相同,因为 NHibernate 无法处理它。 C# 版本由 NHibernate 处理得很好,VB 版本则抛出以下异常:

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

那么两者之间一定有什么不同吗?

Edit 2:

对于乔纳森.这是使用表达式的方法:

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;
}

您看到的差异与 lambda 无关;这只是语言语义的差异。 VB 发出对函数的调用,默认情况下,如果整数溢出,这些函数会抛出异常(因此Checked名称的一部分)。

默认情况下,C# 编译器不会发出“已检查”版本的函数,显然 NHibernate 是由 C# 用户开发的,因此它似乎无法识别“已检查”函数。

如果您转到项目的“编译”选项并单击“高级编译选项”,则可以选中“删除整数溢出检查”框,以便 VB 具有默认的 C# 行为,并且您不应再收到该错误:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 VB 中的 lambda 表达式与 C# 中不同? 的相关文章

随机推荐

  • Azure 如何启用完整的 WebJob 日志

    当我在 Windows Azure 中将控制台应用程序作为 WebJob 运行时 在几行日志之后它会添加一条警告 05 06 2014 09 42 40 gt 21026c WARN Reached maximum allowed outp
  • 使用默认的其他模板参数推导第一个模板参数

    Gcc 和 clang 似乎在这段代码是否应该编译的问题上存在分歧 include
  • Log4J动态创建日志文件

    我已在每个进程运行时成功创建了日志 我现在遇到的问题是 任何被调用的不是当前正在运行的进程的子进程的包都不会将其日志写入我的文件 例如 我创建一个名为 running log 的新日志文件 正在运行的进程是 com me foo 该类内部调
  • 如何从数据库中按类别显示数据?

    因此 我的网站允许用户创建联系人列表 现在我添加了用户命名的类别 我当前正在使用从 SQL 查询生成的关联数组的 while 循环来显示联系人列表 所以它看起来像这样 Contacts Contact 1 Contact 2 Contact
  • 错误:此类与关键项目ToolBar 的键值编码不兼容? [复制]

    这个问题在这里已经有答案了 嘿 我无法弄清楚我遇到的错误 我的应用程序正在运行 然后我不确定我做了什么 但它现在无法打开 而是收到此错误 Terminating app due to uncaught exception NSUnknown
  • 无法在 Docker-Driver Windows 10 上访问 Minikube(v1.18.1) Ingress

    我的问题与this https stackoverflow com questions 66275458 could not access kubernetes ingress in browser on windows home with
  • 使用 PHP(或其他语言)流式传输数据(例如音乐)

    多年来 我一直在研究如何从我的计算机创建音乐流 我见过一些程序 但我见过的任何有用的东西都仅限于 Windows 我使用 Mac 最终 我产生了兴趣how流工作 有什么办法可以创建我的own流 可能使用套接字函数PHP 有没有PHP图书馆为
  • 如何在nhibernate中使用PK删除对象?

    如何删除对象而不先从数据库中获取它 在另一个 ORM 中 我可以这样做 session Delete
  • mojolicious 引用的存储变量并不总是定义的

    我仍在学习 mojolicious 和 MVC 框架 所以这可能是一个问题 我认为这个问题是错误的 所以如果我愿意 请建议一种更好的方法来执行以下操作 我有一条路线 route param 其中 param 有时被定义 有时则没有 我尝试在
  • 为什么“--force-recreate”不重建我的 docker mysql 映像?

    我创建了一个 docker MySql 5 7 映像 然后想更改几个名称 我的 docker compose yml 文件最终像这样 version 3 3 services db image mysql 5 7 restart alway
  • 未找到 osx sys/io.h

    我想在 os x 下使用 cc 编译为 linux 开发的 c 程序 它包括标头 sys io h 编译的时候报错说找不到这个文件 os x下不是有sys io h头文件吗 任何帮助将非常感激 Thanks Include
  • 更改flutter应用程序图标的背景颜色

    我想将背景图标更改为 fe6017 I use flutter launcher icons set adaptive icon background fe6017 但这不起作用 我也尝试调整图像大小 但它总是收缩并放置white我的图像周
  • 如何使用JW Player播放rtmp流?

    我想知道如何使用 JW Player 流式传输 RTMP 我刚刚开始 嵌入没有帮助 因此如果有人可以分享适合他的代码 将会有所帮助 我们这里有一个指南 http www longtailvideo com support jw player
  • jqgrid 获取所有网格列名称

    有没有办法获取网格的所有列名称 您可以使用以下方式获取列名称 var columnNames list 0 p colNames or var columnNames list jqGrid getGridParam colNames 唯一
  • 给定日期范围内的每日活跃用户数

    我需要根据开始日期和结束日期查找每日活跃用户总数 报名表 id registration no start date end date 1 1000 2014 12 01 2014 12 03 2 1001 2014 12 01 2014
  • PHP 中的“贪婪标记解析”是什么?

    PHP 中的 贪婪标记解析 是什么 我在 Codeigniter 指南中找到了这一点 除非需要解析变量 否则始终使用单引号字符串 并且在确实需要解析变量的情况下 请使用大括号来防止贪婪标记解析 我的字符串 foo 带有良好解释的答案会有所帮
  • React 和 babel 中的可选链接运算符

    在我的项目中我配置 babel presets react es2015 stage 1 transform optional chaining plugins transform runtime 这是我的devDependencies i
  • 如何一次运行多种语言的 tesseract?

    我必须分析包含英语和日语文本的图像 当我默认运行 tesseract 时 l eng 一些日语字符丢失了 否则 如果我用日语运行 tesseract l jpn 一些英文字符丢失 例如电子邮件 如何运行一个同时识别英语和日语字符的进程 从
  • dlopen 与链接开销

    假设我有一个库 foo so 当构建我的二进制文件 需要这个库 时 我可以 1 链接 foo so 或者 2 在程序源代码中 dlopen 这个库 然后调用这个库提供的函数 当我从库中调用函数时 1 和 2 之间有性能差异吗 请注意 我知道
  • 为什么 VB 中的 lambda 表达式与 C# 中不同?

    我刚刚在 NHibernate 中遇到了一个错误 该错误恰好已经被提出 https nhibernate jira com browse NH 2763 https nhibernate jira com browse NH 2763 我不