我的代码:
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();
}
最佳答案
如果您添加了自定义的 ==
运算符重载,并将其弄得一团糟,就会发生这种情况。重载将更喜欢 ==(MyTable,MyTable)
重载,并在与 null
比较时选择它:
static class Program {
static void Main() {
Foo x = new Foo();
if(x==null) {
System.Console.WriteLine("Eek");
}
}
}
public class Foo {
public static bool operator ==(Foo x,Foo y) {
return true; // or something more subtle...
}
public static bool operator !=(Foo x, Foo y) {
return !(x==y);
}
}
关于c# - Entity Framework 对象不为空,但 `== null` 返回 true,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24371096/