C# 合并运算符不会替换 null 方法返回值?

Posted

技术标签:

【中文标题】C# 合并运算符不会替换 null 方法返回值?【英文标题】:C# coalesce operator doesn't replace a null method return value? 【发布时间】:2011-08-10 12:13:32 【问题描述】:

我有这个代码:

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

【问题讨论】:

另外,您可以通过将 return 语句修改为 return query.DefaultIfEmpty(new MyClass()).First(); 来避免使用 operator?? 尝试将其分成两行 (MyClass _localMyClass = MyClassDAO.GetMyClassByID(123); _localMyClass = _localMyClass ?? new MyClass();) 并逐步执行。 你能展示整个班级吗?我想看看顶线相对于其余部分的位置。 哇...我现在有点暴躁...我关闭并重新打开了 Visual Studio 2010...现在它工作正常。不错。 很抱歉给您带来了困惑。我非常感谢所有的建议!我无法在 8 小时内“回答我自己的问题”。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

好的,由于自我回答已经被接受,所以在将来有人需要另一个可能的情况时提供一个形式回答:

 FirstOrDefault() 

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

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

0.02 美元

【讨论】:

价值类型的优点。始终确保您知道正在运行查询的对象是什么以及返回值应该是什么。在我的示例中,如果有人修改查询以返回 MyClass 中的一个字段,而不是整个 MyClass,那么该字段很可能是一个值类型(int、bool 等),那么它确实会失败 ??检查,因为值类型不能为空。 firstOrDefault() 将为 int 字段返回 0,为 bools 等返回 false。如果您不确定 FirstOrDefault() 将返回什么,请务必仔细检查!【参考方案3】:

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

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

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

【讨论】:

以上是关于C# 合并运算符不会替换 null 方法返回值?的主要内容,如果未能解决你的问题,请参考以下文章

?? 运算符(C# 参考)

可能重载空合并运算符?

c#中的?是什么意思

null合并运算符??和null条件运算符?.

《C#高级编程》读书笔记:运算符

右侧的三元/空合并运算符和赋值表达式?