返回非 null 值的方法仍然将 null 分配给变量

Method returning a non-null value still assigns null to a variable

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

在一个 class 我有:

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;
}

方框 class 看起来像这样:

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' 变量保持为空并且不会更改。

box 变量应等于 foundBox 值,但它保持为空。

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

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

相反,box 不是 null,并且调试器正在评估 以显示值 的某些内容正在抛出异常。也许是坏了ToString()。它提到 ListDictionaryInternal 的事实意味着您可能想要查看 特别是 类型中的任何集合或字典用法,以及可能标记为 [=55= 的任何内容] 属性,例如 [DebuggerDisplay(...)].

如果要测试box是否为null,请直接询问控制台:

box == null

并且它将 return truefalse (警告:假设没有损坏的静态相等运算符,这也是可能的;为了避免这种情况,一个好的备选方案是:

box is object

如果它不是 null,它将可靠地 return true,如果它是 null,则 false,而不使用静态相等运算符。


编辑:根据评论中的讨论,我绝对相信这是一个损坏的 == 运算符,如下所示: