C#coalesce运算符不替换null方法返回值?

时间:2011-04-21 17:49:47

标签: c# coalesce null-coalescing-operator null-coalescing

我有这段代码:

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部分?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

我正在使用带有Service Pack 1的Visual Studio Ultimate 2010。

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

答案 2 :(得分:0)

好的,既然已经接受了自我回答,那么如果有人在将来需要另一个可能的案例,那么这是一个形式上的答案:

 FirstOrDefault() 

实际上会返回默认值,对象引用可以是 null ,但不能是值类型。如果 MyClass 是一种值类型(请考虑:struct),那么你会更好

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

$ 0.02