【发布时间】:2014-06-24 18:11:44
【问题描述】:
我的代码:
var x = myEntities.MyTable
.Include("MyOtherTable")
.Include("MyOtherTable.YetAnotherTable")
.SingleOrDefault(c => c.Name == someName);
这会正确返回我可以在 Visual Studio 中以智能感知方式查看的对象。
下一行是:
if (x == null)
{
}
但是,此语句返回 true 并且 {} 中的代码会执行。这是什么原因造成的?
编辑:
在空检查上方添加了这一行:
var someName = x.Name;
这段代码完美运行,someName 变成了 string,其中包含对象的名称。
== null 仍然返回 true。
IDE 截图:
编辑:函数中的代码似乎可以工作:
public void bibble(MyObjectType s)
{
if (s == null)
{
throw new Exception();
}
}
--
string someName = testVariable.Name;
this.bibble(testVariable); // Works without exception
if (testVariable == null)
{
// Still throws an exception
throw new Exception();
}
现在它不会在其他方法中评估为 true,但在同一变量的 main 方法中评估。好诡异。
编辑:这是本节的 IL:
IL_0037: callvirt instance string [MyLibrary]MyLibrary.MyCompany.MyObjectType::get_Name()
IL_003c: stloc.3
IL_003d: ldarg.0
IL_003e: ldloc.2
IL_003f: call instance void MyOtherLibrary.ThisClass::bibble(class [MyLibrary]MyLibrary.MyCompany.MyObjectType)
IL_0044: nop
IL_0045: ldloc.2
IL_0046: ldnull
IL_0047: ceq
IL_0049: ldc.i4.0
IL_004a: ceq
IL_004c: stloc.s CS$4$0001
IL_004e: ldloc.s CS$4$0001
IL_0050: brtrue.s IL_0059
IL_0052: nop
IL_0053: newobj instance void [mscorlib]System.Exception::.ctor()
IL_0058: throw
编辑:更奇怪的是:
var myEFObjectIsNull = testVariable == null;
// Intellisense shows this value as being FALSE.
if (myEFObjectIsNull)
{
// This code is ran. What.
throw FaultManager.GetFault();
}
【问题讨论】:
-
更新问题。太奇怪了!
-
你确定
if后面没有分号吗? -
@celerno 会抛出编译器错误,除非
x是bool。 -
在这一点上,消除了明显的问题,我倾向于认为“编译器错误”(它偶尔会发生)。您能否尝试将
var x = ...之后的所有内容拉到一个单独的方法中,即var x = ...; AnotherMethod(x);,在AnotherMethod中使用您的if(x==null)等? -
@SLC 如果您仍然可以通过将代码移回原样来重现它,我会对失败代码的 IL 非常感兴趣。如果我们能证明它是一个编译器错误,我们应该确保它被记录下来。你熟悉提取 IL 吗?
标签: c# entity-framework