【问题标题】:Object is null even though the object exists and is shown as such in the debugger [duplicate]即使对象存在并且在调试器中显示为空,对象也为空[重复]
【发布时间】:2019-11-26 18:16:49
【问题描述】:

我正在编写一个 Xamarin.Android 应用程序并在那里使用 JSON API,当它在数据库中找不到对象时,它只是为数据字段返回一个空字符串。不是一个好的设计,但我无法改变它。为了检查这种可能性,我编写了这个简短的函数,我将它绑定到包含 JsonObject 的 LanguageExt.Either 对象,并且当数据为空时返回一个左值。

        private Either<Exception, T> CheckData<T>(T json) where T : JsonObject
        {
            if (json.Data == null)
            {
                return Left<Exception, T>(new KeyNotFoundException());
            }
            else
            {
                return Right(json);
            }
        }

问题是,它总是返回一个左值。尝试将条件更改为 json.Data.Equals(null) 会引发 NullPointerException。到目前为止,我猜我实际上在那里有空值,但是当我在调试器中单步执行程序时,它肯定是填充的而不是空的,即使我在 if 行添加了一个断点。老实说,我实在是束手无策,一个对象怎么可能是空的,但在调试器中却不是空的?

这是错误的图像:

【问题讨论】:

  • "即使对象存在,对象仍为空" -- 不,这不是真的。要么引用为空且不存在对象,要么存在对象且引用不为空。我希望每次有人声称现实与调试器告诉他们的不同时,我都能得到一分钱。当你认为调试器对你撒谎时,那只是因为你误解了你所看到的。不幸的是,您的问题缺乏任何有助于解释您如何出错的细节。因此,在改进之前,我们能做的最好的就是提供规范的“空异常”答案。
  • 我的意思是,你可以看一下截图,你可以看到调试器肯定显示引用不为空,但它进入了 if 子句,我是否应该用调用代码再次提问?
  • 只是好奇,你能试试if (json?.Data == null),看看会发生什么?
  • 和以前一样
  • if (json?.Data != null)怎么样

标签: c# xamarin.android visual-studio-debugging language-ext


【解决方案1】:

使用==

if(json.Data == null)
{
}

【讨论】:

  • 我已经这样做了,它在截图中看起来不像,因为我使用的是带有连字的 Fira Code 字体,但其中的代码与文字
  • JsonObject 在哪里?我不认为它是NewtonSoft 的一部分。当您执行if(json.Data == null) 时,可能不会评估Data 属性。但是,当您进行快速观看时,Visual Studio 会评估此属性。检查data 属性的getter 是否有延迟加载。这是我的猜测:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2019-05-14
相关资源
最近更新 更多