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
)你会更好
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 方法返回值?的主要内容,如果未能解决你的问题,请参考以下文章