【发布时间】:2011-01-11 15:36:56
【问题描述】:
长话短说。我有 2 个包含相同类型(但用于不同事物)的列表,我想知道其中一个列表是否包含具有特定名称的项目。
我的原始代码运行良好,是:
if (listA.Any(var => var.Name == strMatch) || listB.Any(var => var.Name == strMatch))
{
//Do something
}
此代码运行良好,无论该项目出现在一个或两个列表中。 后来,我发生了几次“不可能”的崩溃——这些事情永远不会发生。 我将其追溯到 if 语句 NEVER 返回 true。
这让我很困惑......我无法弄清楚出了什么问题。最终我放弃了,像这样在 lamda 表达式的主体周围贴上了括号......
if (listA.Any(var => (var.Name == strMatch)) || listB.Any(var => (var.Name == strMatch)))
{
//Do something
}
重新运行我的程序后,所有“不可能”的错误都消失了,并且运行正常。删除多余的备份会导致错误再次出现。
我以前从未遇到过 lambda 表达式的这个问题(尤其是在它们工作的地方,然后,在几次运行正常工作后中断)并且我的其他 lambda 表达式工作正常。
示例:以下代码按预期 100% 工作(假设其中一个列表中有匹配项)
Item item =
ListA.FirstOrDefault(var => var.Name == strMatch) ??
ListB.FirstOrDefault(var => var.Name == strMatch);
发生了什么事?为什么编译器对 some lamda 表达式而不是其他表达式挑剔? (即使它们相同?)???
更新 :: 系统详情 这在 Microsoft Visual Studio 2008(专业版)、Windows Vista 32 位中遇到过。
更新 Video link,这已经在其他计算机上进行了测试,并且不可重现。让我觉得我的电脑注定要失败。重装VS没有效果。
请忽略任何背景猫的声音,她只会在听到我录东西时才叫。
【问题讨论】:
-
这是表现异常的实际逐字代码吗?
-
如果你真的可以重现这个,你应该在你自己的机器上采取更多的步骤来识别问题,例如。添加或删除括号时,字节码有什么不同?
-
代码是逐字逐句的,除了更改列表的名称以便更容易地阅读上下文之外,实际类型称为“变量”,而不是“项目”。
-
@mquander 肯定是指 IL 代码,因为很少有人阅读 .net ByteCode?span>
-
您在代码中还做了什么?你是多线程吗?您是否在某处使用了不安全的代码段?我怀疑损坏的数据或代码是导致这种行为的原因,而不是编译器。
标签: c# lambda operator-precedence