Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法返回非null值时,仍将null赋值给变量_C#_Ef Core 2.2 - Fatal编程技术网

C# 方法返回非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

我有一个方法,可以根据字段搜索数据库中的内容。调用该方法并将返回值保存在变量中时,函数末尾的返回值不为null。调用函数并调试变量中可用的内容后,该值仍然为null

在一个班级里,我有:

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没有告诉我们“顺便说一句,我在这里给你的自定义
=
操作符打电话”(这就是我怀疑正在发生的事情)