我有一种方法可以根据字段在数据库中搜索某些内容。当调用该方法并将返回值保存在变量中时,函数的末尾返回值不为null。调用该函数并调试变量中可用的内容之后,该值仍为null!
我在一堂课上有
var box = _someClass.GetBoxByRfidAsync("testvalue");
public Box GetBoxByRfidAsync(string rfid)
{
var foundBox = _dc.Boxes
.Include(b => b.Stack)
.Include(b => b.Type)
.Where(box => box.RFID1 == rfid)
.FirstOrDefault();
return foundBox;
}
box类如下:
public class Box
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string RFID1 { get; set; }
public string Rit { get; set; }
public Stack Stack { get; set; }
public int PosInStack { get; set; } //lowest box is 0, highest is 7
public BoxType Type { get; set; }
public DateTime Inserted { get; set; }
}
该方法被执行,在GetBoxByRfidAsync的结尾,我可以使用调试器看到foundBox不为空。
我跳过函数的末尾,然后将foundBox值分配给box变量。出于某种原因,“框”变量保持为空且不会更改。
box变量应等于foundBox的值,但保持为空。
以下是我的调试会话的屏幕截图:
答案 0 :(得分:6)
您在调试器中显示的错误并不意味着box
是null
。如果box
是null
,那么它实际上只会报告:null
。
相反,box
不是null
,调试器正在评估以显示该值的东西引发了异常。可能是损坏的ToString()
。它提到ListDictionaryInternal
的事实意味着您可能想特别查看 类型内的任何集合或字典用法,以及可能带有“ debugger”属性的任何内容,例如{ {1}}。
如果要测试[DebuggerDisplay(...)]
是否为box
,请询问立即控制台:
null
,它将返回box == null
或true
(注意:假设没有坏的静态等式运算符,这也是可能的;要避免这种情况,一个好的选择是:
false
,如果不是{{1},则可靠地返回box is object
,如果不是true
,则可靠地返回null
,而无需使用静态相等运算符。
编辑:基于评论中的讨论,我完全相信这是一个损坏的false
运算符,如此处所示: