c#合并操作符不会替换null方法返回值

本文关键字:null 方法 返回值 替换 合并 操作符 | 更新日期: 2023-09-27 17:50:43

我有这样的代码:

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()没有在实体框架上下文中找到hit,即"ctx"对象。因此,要返回的"默认"值是null,因为查询的目标是一个类。

第一个比特的结果,使用??,结果_localMyClass是什么?我会说是new MyClass()。相反,_localMyClass最终为空。我试着用不同的括号组逻辑,但仍然没有运气。

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

有人能解释一下为什么它会以这种方式工作吗?为什么它不识别方法返回值为null,然后使用new部分?

c#合并操作符不会替换null方法返回值

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

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

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

既然自我回答已经被接受了,一个备考答案,以防将来有人需要另一种可能的情况:

 FirstOrDefault() 

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

  • 检查泛型方法中的默认(T)
  • 使用DefaultIfEmpty()扩展名使用特定值
  • 使用MyClass? nullable类型(nullable的缩写)
0.02美元

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

我使用的是Visual Studio Ultimate 2010 w/service pack 1.

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