返回非null值的方法仍将null赋给变量

时间:2019-06-04 08:23:18

标签: c# ef-core-2.2

我有一种方法可以根据字段在数据库中搜索某些内容。当调用该方法并将返回值保存在变量中时,函数的末尾返回值不为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的值,但保持为空。

以下是我的调试会话的屏幕截图:

End of method Immediate window showing box is still null

1 个答案:

答案 0 :(得分:6)

您在调试器中显示的错误并不意味着boxnull。如果boxnull,那么它实际上只会报告:null

相反,box不是null,调试器正在评估以显示该值的东西引发了异常。可能是损坏的ToString()。它提到ListDictionaryInternal的事实意味着您可能想特别查看 类型内的任何集合或字典用法,以及可能带有“ debugger”属性的任何内容,例如{ {1}}。

如果要测试[DebuggerDisplay(...)]是否为box,请询问立即控制台:

null

,它将返回box == nulltrue(注意:假设没有坏的静态等式运算符,这也是可能的;要避免这种情况,一个好的选择是:

false

,如果不是{{1},则可靠地返回box is object,如果不是true,则可靠地返回null,而无需使用静态相等运算符。


编辑:基于评论中的讨论,我完全相信这是一个损坏的false运算符,如此处所示:

enter image description here