C# 空不等于空?
以下代码C# 空不等于空?,c#,.net,C#,.net,以下代码 if (_LastMouseClickArea != null) { if (_LastMouseClickArea.GridItem == GridItem.DataCell) {... 失败,因为\u LastMouseClickArea为空。我知道这听起来很傻,所以我来了 从即时窗口: _LastMouseClickArea != null true _LastMouseClickArea nul
if (_LastMouseClickArea != null)
{
if (_LastMouseClickArea.GridItem == GridItem.DataCell)
{...
失败,因为\u LastMouseClickArea
为空。我知道这听起来很傻,所以我来了
从即时窗口:
_LastMouseClickArea != null
true
_LastMouseClickArea
null
_LastMouseClickArea == null
false
_LastMouseClickArea.GetType()
'((object)(this._LastMouseClickArea))' is null
什么会导致这种行为 你可能有比赛条件吗?就像在你检查时它不是空的,但是在你能够使用它之前,一个线程将它设置为空。解决方案:在提交之前,我记得做一些橡皮鸭调试。这让我检查了
==
是如何实现的,而且,果然有一些奇怪的P/Invoke调用,其null!=空
等于真
因此,如果有人遇到同样的问题,这里是供将来参考的。可以回答您自己的问题,但这不是合适的格式。这里是否有一个开放的问题?请从问题中删除解决方案,并将其作为更详细的答案发布。您一定在做其他事情,因为
null==null
总是给我带来积极的结果。@ChrisF我会按照您的建议去做。是否可能在您的代码库中的某个地方运算符==是否已被重写?执行此调用不应该是P/Invoking。我看到了一个模式,你检查Nan!=Nan,因为这是一个硬件加速调用,但不适用于空引用。Null==Null将在默认的C#实现中返回true。执行的P/Invoke调用是什么?@Spence沿着返回CPINVOKE.GridArea_eq(CValueType.getCPtr(lhs),CValueType.getCPtr(rhs))的思路代码>