5

我有这个代码:

MyClass _localMyClass = MyClassDAO.GetMyClassByID(123) ?? new MyClass();

这是方法:

    public static MyClass GetMyClassByID(int id)
    {
        var query = from m in ctx.MyClass
                    where m.MyClassID == id
                    select m;

        return query.FirstOrDefault<MyClass>();
    }

所以FirstOrDefault()在实体框架上下文中没有找到命中,即“ctx”对象。所以要返回的“默认”值是null,因为查询的目标是一个类。

使用 , 的第一位代码的??结果_localMyClass是什么?我会说这将是new MyClass(). 相反,_localMyClass最终为空。我尝试用各种括号对逻辑进行分组,但仍然没有运气。

更奇怪的是;当我设置调试断点并将 复制/粘贴MyClassDAO.GetMyClassByID(123) ?? new MyClass()到 Visual Studio 的监视屏幕中时,结果是new MyClass()而不是null.

谁能解释为什么它会以这种方式工作?为什么它不将方法返回值识别为null然后使用该new部分?

4

3 回答 3

2

只是一个猜测,因为我之前犯过这个错误,它让我困惑了很长时间。

您是否有条件断点,并且在该条件断点中您的条件是否为_localMyClass = null

有一次,当我打算==在条件断点中写入时,我做了类似的事情,结果调试器将值设置为 null。同样,您是否有任何可能将其设置为 null 的监视值?

于 2011-04-21T18:00:13.037 回答
1

好的,由于已经接受了自我回答,因此如果将来有人需要另一个可能的情况,请提供形式上的回答:

 FirstOrDefault() 

实际上将返回可以用于对象引用的默认值null,但不能用于value-types。如果MyClass是一个值类型(想想:)struct你会更好

  • 在通用方法中检查 default(T)
  • 使用 DefaultIfEmpty() 扩展使用特定值
  • 使用MyClass?可空类型(Nullable 的缩写)

0.02 美元

于 2011-04-25T14:38:14.747 回答
0

关闭并重新打开 Visual Studio 后,代码运行良好。

我正在使用带有 service pack 1 的 Visual Studio Ultimate 2010。

我过去也遇到过这种情况,应该记得先尝试一下。我注意到 VS 有时似乎表现得很奇怪,尤其是在调试中运行 Web 应用程序时,特别是在本地运行 Web 应用程序(从我的本地 IIS)并附加到 w3wp.exe 时。

于 2011-04-25T13:20:35.160 回答