C# 方法返回非null值时,仍将null赋值给变量
我有一个方法,可以根据字段搜索数据库中的内容。调用该方法并将返回值保存在变量中时,函数末尾的返回值不为null。调用函数并调试变量中可用的内容后,该值仍然为null 在一个班级里,我有:C# 方法返回非null值时,仍将null赋值给变量,c#,ef-core-2.2,C#,Ef Core 2.2,我有一个方法,可以根据字段搜索数据库中的内容。调用该方法并将返回值保存在变量中时,函数末尾的返回值不为null。调用函数并调试变量中可用的内容后,该值仍然为null 在一个班级里,我有: var-box=\u someClass.GetBoxByRfidAsync(“testvalue”); 公共框GetBoxByRfidAsync(字符串rfid) { var foundBox=\u dc.box .Include(b=>b.Stack) .Include(b=>b.Type) .Where
var-box=\u someClass.GetBoxByRfidAsync(“testvalue”);
公共框GetBoxByRfidAsync(字符串rfid)
{
var foundBox=\u dc.box
.Include(b=>b.Stack)
.Include(b=>b.Type)
.Where(box=>box.RFID1==rfid)
.FirstOrDefault();
回收箱;
}
box类如下所示:
公共类框
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
公共字符串RFID1{get;set;}
公共字符串Rit{get;set;}
公共堆栈{get;set;}
public int PosInStack{get;set;}//最低的框是0,最高的框是7
public BoxType类型{get;set;}
插入的公共日期时间{get;set;}
}
该方法将被执行,在GetBoxByRfidAsync的末尾,我可以使用调试器看到foundBox不为null
我跨过函数的末尾,转到将foundBox值赋值给box变量。出于某种原因,“box”变量保持为空且不更改
box变量应等于foundBox值,但保持为null
以下是调试会话的一些屏幕截图:
调试器中显示的错误并不意味着
框
为null
。如果框
为null
,它会直接报告:null
相反,框
为非空,调试器正在计算以显示该值的内容引发异常。可能是一个坏掉的ToString()
。事实上,它提到了ListDictionaryInternal
,这意味着您可能需要特别查看类型中的任何集合或字典用法,以及可能使用“debugger”属性标记的任何内容,例如[DebuggerDisplay(…)]
如果要测试框
是否为空
,请询问即时控制台:
box==null
并且它将返回true
或false
(注意:假设没有中断的静态相等运算符,这也是可能的;为了避免这种情况,一个好的替代方法是:
框是对象
如果它是非空的,则可靠地返回true
,如果它是空的,则可靠地返回false
,而不使用静态相等运算符
编辑:根据评论中的讨论,我绝对相信这是一个坏的
=
操作符,如下所示:
只是为了确定:您是否需要再次点击F10?如果
foundBox
不为空,它肯定会被分配到box
。当您使用F10并离开该方法时,分配还没有发生。要明确的是:如果添加,在返回foundBox
之前,如果(foundBox==null)抛出新的InvalidOperationException(“foundBox为null”);,然后在var box=…
之后添加行if(box==null)抛出新的InvalidOperationException(“box为null”)
-您是否得到第二个异常?您能为抛出的方法发布代码吗?它是GetStackWithLocationandCoordinations
?还是box类。@AvinKavish推测,但我想知道对于某些Foo
,是否box
实现了IEnumerable
,并且IDE正在尝试评估迭代器以显示但是GetEnumerator()的实现类型中的
正在接触此类型中为null的字段
scenario@AvinKavish在第292行,我要求输入box.Type,该行给出了NullReferenceException。这两条语句都返回与NullReferenceException相同的错误。在调试过程中,将鼠标悬停在box变量上时,不会显示任何内容另外,你知道是什么原因吗?否则我可能会重写应用程序的这一部分。@Bastienverschaete如果这些语句返回一个NullReferenceException
,那么我更怀疑一个损坏的static==
操作符。请检查操作符。唯一的方法是foo==null
可以抛出一个e例外是:在重写任何内容之前,通过一个损坏的静态==
运算符,给我们一个堆栈跟踪和抛出的方法的代码。到目前为止,你只提出了关于空值的推测和理论,没有确凿的证据。你在哪里观察到该框为空,你如何知道它导致了你描述的异常?@Bastienverschaete我添加了一个图像来精确显示一个坏的==
操作符如何在一个非null
值上导致这种情况(尽管我猜一旦涉及=
操作符,它也可能抛出一个null
值)@AvinKavish你要求的东西显然是不可用的;OP向我们展示了他们在做什么——在即时窗口中测试null
的东西。他们正确地展示了可用的东西。IDE没有告诉我们“顺便说一句,我在这里给你的自定义=
操作符打电话”(这就是我怀疑正在发生的事情)