问题标签 [null-coalescing]
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# - 空条件运算符不适用于 Func在泛型方法内
这是编译器错误还是有特定选择的原因导致空条件运算符不适Func
用于泛型方法内部?
举个例子,以下内容无法编译
编译器产生的错误是CS0023 Operator '?' cannot be applied to operand of type 'T'
我知道你可以做到这一点,但是:
那么为什么不允许呢?
然而,进一步详细说明Action<T>
按预期工作。
更新(2017-01-17):
经过一些更多的研究,它变得更没有意义了,即使有以下几点:
假设我们有一个类(引用类型)
假设我们有一个Func<int>
以下作品:
这意味着根据那里应用的逻辑,使用and运算符Func<T>
的值类型应该可以工作。null-conditional
null-coalescing
但是,一旦左侧的泛型类型null-conditional
是没有约束的泛型,那么它就不能应用它应该能够考虑的相同逻辑,当类型时,它可以将相同的逻辑应用于值类型和引用类型被明确应用。
我知道编译器的限制,这对我来说没有意义,为什么它不允许它以及为什么它希望输出不同,无论它是参考类型还是值类型,考虑到手动应用类型会产生预期的结果.
java - 没有“else”表达式的三元赋值
是否可以对类型的三元赋值表达式使用简写
我在想一些事情
并不是说它可以节省很多打字,我只是好奇是否存在这样的东西。我最近在 PHP 7 中发现了null coalesce 运算符,它做了类似的事情。对我来说,它看起来比
因为这些是赋值,所以从左到右阅读时使用三元表达式看起来更自然。假定的重复问题与分配无关,在我看来,这是三元运算符的特殊用例。
c# - '??' 中的 C# 类型推断(“var”)赋值 空合并运算符
我已经阅读了许多关于空合并??
运算符的 SO 问题,但它们似乎都没有解决以下具体问题,既不涉及可空性(这里)、运算符优先级(这里和这里),也不是特别是隐式转换(这里、这里、这里和这里)。我还阅读了.NET 文档(更多在这里)并尝试阅读官方规范,但遗憾的是无济于事。
所以这里。以下两行之间的唯一区别是在第二行中使用var
for 类型推断,而Random
在第一行中使用显式类型,但第二行给出了如图所示的错误,而第一行很好。
CS0841:在声明之前不能使用局部变量 'y'
第二行究竟是什么使结果不确定?
??
从我上面引用的 hubub 中,我了解到运算符左侧的可能性null
引入了对其右侧实际实例化类型的运行时确定的依赖。嗯,好吧,我猜,……那是什么意思?也许这个网站上的操作员普遍发出的警报量??
应该是某种可怕的警告......
现在归零,我认为var
关键字的全部意义(特别反对)是,根据定义dynamic
,它不受运行时考虑的影响。
换句话说,即使我们采用“从不超越任何赋值=
运算符”的保守但完全可以辩护的规则,这样我们因此无法从 的右侧获得任何有用的信息??
,然后仅基于左侧,整体结果必须“兼容” Random
。也就是说,结果必须是Random
或更具体的(派生的)类型;它不能更普遍。因此,根据定义,不Random
应该是推断的类型,因为var
?
据我所知,var
由于运行时的考虑而破坏它会破坏它的目的。这不正是dynamic
为了这个吗?所以我想问题是:
- 空合并运算符是我理解 C# 静态(即编译时)类型哲学的唯一和/或罕见的例外吗?
- 如果是,那么这种设计与这里似乎正在发生的事情之间的好处或权衡是什么,即故意将非确定性引入静态类型推断系统,而它以前没有表现出来?
dynamic
如果不破坏静态类型的纯度,就不能实现吗? - 强类型的要点之一难道不是通过向开发人员提供可操作的反馈来实现编译时设计的严谨性吗?为什么不能
var
只维持严格保守的政策——总是推断出可以静态推断的最具体的类型——同时空合并运算符根据来自未来的信息做任何它想做的事情?
php - PHP 5 登录“语法错误,意外'?' “在使用时??操作员
此代码是登录表单的一部分,我想确保该字段不为空。当我使用这行代码时,出现以下错误:
syntax error, unexpected '?'
我知道我收到错误是因为我正在使用 PHP 5.5。
谢谢!
swift - 可选的链接和合并,包括。函数参数
可选链让我们决定对象的存在:
它将始终设置len
为整数。
非可选函数参数是否有类似的可能?考虑下面的例子,三元运算符已经不太优雅了。
如果我们继续链接,它很容易变得一团糟(这就是我真正看到的):
此外,它也开始变得多余,定义了两次默认值。
最后一行还有更简洁的解决方案吗?
php - 空文本输入意味着空 $_POST[] 元素?(空合并)
所以我的问题是:
如果我不在输入中写任何东西
在使用 post 方法的简单形式中,当我$_POST
在操作 url 中收到数组时,它$_POST["test"]
作为空字符串 ( $_POST["test"] => ""
) 存在。
所以我不能使用空合并,因为$var = $_POST["test"] ?? 'default';
它总是$var = "";
(正常)。
有什么办法可以解决这个问题?
c# - 与 JObject 结合使用的空合并运算符
我编写了以下代码以从给定的 JObject 中读取 JArray。
据我了解,当 JObject 中“tags”的值为 null 时,应将 IEnumerable 初始化为空。
但是,当 json 看起来像
如果我要将上面的行设为 null 并将 enumerable 初始化为空,我需要进行哪些更改?
c# - ?? 双精度运算符 (C#) 返回不正确的结果
使用 C#,知道为什么以下方法返回57.999999999999993(而不是58)吗?
c# - 带返回的空合并运算符 (??)
我想知道为什么可以在 C# 7.0 中做到这一点:
..但不是这个:
有人可以解释一下吗?
swift - 展开/合并多级可选
我正在尝试编写一个函数来解开具有任意数量嵌套级别的选项。这是我正在使用的测试:
我可以使用基本的通用函数获得正确的输出:
但这并不妨碍使用与可选类型不同的类型调用该函数。例如,我可以打电话a.unwrap("foo")
,它会打印“foo”而不是“1”,因为你当然不能Int???
转换为String
.
我尝试使用它Wrapped
,它半正确地限制了默认值,但没有给出正确的输出:
它只解开一个可选级别,而不是全部三个,并且由于 nil 是一个有效值,Int??
因此它不会返回默认值。
有什么方法可以安全地做我想做的事吗?