Nib*_*Pig 4 c# entity-framework
我的代码:
var x = myEntities.MyTable
.Include("MyOtherTable")
.Include("MyOtherTable.YetAnotherTable")
.SingleOrDefault(c => c.Name == someName);
Run Code Online (Sandbox Code Playgroud)
这正确地返回了我可以在visual studio中的intellisense中查看的对象是正确的.
下一行是:
if (x == null)
{
}
Run Code Online (Sandbox Code Playgroud)
但是,此语句返回true并{}执行内部的代码.什么可能导致这个?
编辑:
在null检查上方添加了这一行:
var someName = x.Name;
Run Code Online (Sandbox Code Playgroud)
此代码完美地工作,someName变为a string,其中包含对象的Name.
将== 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();
}
Run Code Online (Sandbox Code Playgroud)
现在它不会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
Run Code Online (Sandbox Code Playgroud)
编辑:更奇怪的是:
var myEFObjectIsNull = testVariable == null;
// Intellisense shows this value as being FALSE.
if (myEFObjectIsNull)
{
// This code is ran. What.
throw FaultManager.GetFault();
}
Run Code Online (Sandbox Code Playgroud)
如果您添加了自定义==运算符重载并使其变得混乱,则会发生这种情况.重载将更喜欢==(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);
}
}
Run Code Online (Sandbox Code Playgroud)