问题标签 [null-coalescing-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 多次合并合并?
C# 中有什么东西可以让你做一些事情,比如
它会从左到右选择第一个不为空的?
如果此操作员不这样做,是否有可能的替代方法以最少的代码提供类似的功能?
c# - 调用链中的空值合并
如果我有一长串对象,每个对象都有可能在“Linq where”子句中返回 null,例如
索引器可以返回 null,而“as”运算符可以返回 null。对象可能没有连接(即属性为空)。如果在任何地方遇到空值,我希望 where 子句为正在评估的项目返回“false”。相反,它会因空引用异常而中止。
在我看来,这将被设计为在单个 C# 表达式中表达。我不喜欢创建多行语句或为其创建单独的函数。是否有一些我缺少的空合并运算符的用途?
java - 在 C# 中是否有与空合并运算符 (??) 等效的 Java?
是否可以在 Java 中执行类似于以下代码的操作
c# - Null-coalescing 运算符 - 您更喜欢以下哪个?
假设您有一个检查列表是否为空的方法。如果是这样,它会实例化它。
一般来说,我们会这样做:
我最近了解了空合并运算符,并很想将其更改为:
它更紧凑,看起来它会被编译成与“传统”方法相同的指令集。
可能有点迂腐,但我想知道您是否对这种方法以及您实际使用的方法有任何保留。
c# - 在 C# 中有没有更简单的方法来做到这一点?(空合并类型问题)
有没有更简单的方法来做到这一点?
请注意它和 null-coalesce (??) 之间的区别在于,在返回之前访问了非 null 值(?? op 的第一个操作数)。
c# - C# 合并运算符不会替换 null 方法返回值?
我有这个代码:
这是方法:
所以FirstOrDefault()
在实体框架上下文中没有找到命中,即“ctx”对象。所以要返回的“默认”值是null
,因为查询的目标是一个类。
使用 , 的第一位代码的??
结果_localMyClass
是什么?我会说这将是new MyClass()
. 相反,_localMyClass
最终为空。我尝试用各种括号对逻辑进行分组,但仍然没有运气。
更奇怪的是;当我设置调试断点并将 复制/粘贴MyClassDAO.GetMyClassByID(123) ?? new MyClass()
到 Visual Studio 的监视屏幕中时,结果是new MyClass()
而不是null
.
谁能解释为什么它会以这种方式工作?为什么它不将方法返回值识别为null
然后使用该new
部分?
c# - 奇怪的空合并运算符自定义隐式转换行为
注意:这似乎已在Roslyn中修复
这个问题是在写我对这个问题的回答时出现的,它谈到了null-coalescing operator的关联性。
提醒一下,null-coalescing 运算符的想法是形式的表达式
首先评估x
,然后:
- 如果 的值为
x
空,y
则进行评估,这是表达式的最终结果 - 如果 的值不
x
为空,y
不计算,并且 的值是表达式的最终结果,则在必要时转换为编译时类型x
y
现在通常不需要转换,或者它只是从可空类型到不可空类型 - 通常类型是相同的,或者只是从(比如说)int?
到int
. 但是,您可以创建自己的隐式转换运算符,并在必要时使用这些运算符。
对于 的简单情况x ?? y
,我没有看到任何奇怪的行为。但是,(x ?? y) ?? z
我看到一些令人困惑的行为。
这是一个简短但完整的测试程序 - 结果在评论中:
所以我们有三种自定义值类型,A
和B
,C
以及从 A 到 B、A 到 C 和 B 到 C 的转换。
我可以理解第二种情况和第三种情况......但是为什么在第一种情况下会有额外的 A 到 B 转换?特别是,我真的希望第一种情况和第二种情况是同一件事——毕竟它只是将一个表达式提取到一个局部变量中。
有没有人知道发生了什么?当谈到 C# 编译器时,我非常犹豫要喊“错误”,但我对发生的事情感到困惑......
编辑:好的,这是一个更糟糕的例子,感谢配置器的回答,这让我有更多理由认为这是一个错误。编辑:该示例现在甚至不需要两个空合并运算符...
这个的输出是:
Foo()
在这里被调用两次的事实让我非常惊讶——我看不出有任何理由让表达式被计算两次。
c# - 空合并操作顺序
我从这种方法中得到了奇怪的结果:
当我将 null 传递给 StartDepth 时,合并失败,因为“Depth - StartDepth”似乎是通过首先将 StartDepth 转换为默认值 0(降级?)而不是首先查看它是否为 null 并替换为 Globals 来评估的。而是开始深度。
这是众所周知的事情吗?我能够通过添加括号来完成这项工作,但我真的没想到事情会以这种方式工作。
c# - 空合并运算符 - 为什么要强制转换?
谁能告诉我为什么以下语句中的第一个会引发编译错误而第二个不会?
我尝试了其他可以为空的类型,例如byte?
并得到了相同的结果。谁能告诉我为什么我需要先投反对票?