返回非 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 值,但它保持为空。
以下是我的调试会话的一些屏幕截图:
您在调试器中显示的错误并不意味着 box
是 null
。如果 box
是 null
,它只会报告:null
.
相反,box
不是 null
,并且调试器正在评估 以显示值 的某些内容正在抛出异常。也许是坏了ToString()
。它提到 ListDictionaryInternal
的事实意味着您可能想要查看 特别是 类型中的任何集合或字典用法,以及可能标记为 [=55= 的任何内容] 属性,例如 [DebuggerDisplay(...)]
.
如果要测试box
是否为null
,请直接询问控制台:
box == null
并且它将 return true
或 false
(警告:假设没有损坏的静态相等运算符,这也是可能的;为了避免这种情况,一个好的备选方案是:
box is object
如果它不是 null
,它将可靠地 return true
,如果它是 null
,则 false
,而不使用静态相等运算符。
编辑:根据评论中的讨论,我绝对相信这是一个损坏的 ==
运算符,如下所示:
我有一种方法可以根据字段在我的数据库中搜索某些内容。当调用该方法并将返回值保存在变量中时,函数末尾的返回值不为空。调用该函数并调试变量中可用的内容后,该值仍然为空!
在一个 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 值,但它保持为空。
以下是我的调试会话的一些屏幕截图:
您在调试器中显示的错误并不意味着 box
是 null
。如果 box
是 null
,它只会报告:null
.
相反,box
不是 null
,并且调试器正在评估 以显示值 的某些内容正在抛出异常。也许是坏了ToString()
。它提到 ListDictionaryInternal
的事实意味着您可能想要查看 特别是 类型中的任何集合或字典用法,以及可能标记为 [=55= 的任何内容] 属性,例如 [DebuggerDisplay(...)]
.
如果要测试box
是否为null
,请直接询问控制台:
box == null
并且它将 return true
或 false
(警告:假设没有损坏的静态相等运算符,这也是可能的;为了避免这种情况,一个好的备选方案是:
box is object
如果它不是 null
,它将可靠地 return true
,如果它是 null
,则 false
,而不使用静态相等运算符。
编辑:根据评论中的讨论,我绝对相信这是一个损坏的 ==
运算符,如下所示: