问题标签 [lifted-operators]
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# - System.Nullablenull * int 值的值是多少?
考虑以下陈述:
的价值是 v2
多少?(null
或空字符串?)
如何防止编译器将其标记为无效操作?我需要遵循自定义异常处理吗?
c# - 什么是提升运算符?
我正在看这篇文章,并且正在努力遵循解释提升运算符的 VB.NET 示例。似乎没有等效的 C# 示例或教程。一般来说,我在运算符重载方面没有太多经验,因此在阅读可空类型的同时尝试与 VB.NET 等价物达成协议可能不是最好的起点......
任何人都可以提供对提升运算符的解释以及它们是如何被可空类型使用的吗?这是否只是意味着可空类型本身不会重载运算符,而是会使用它所代表的基础类型中的运算符?
关于提升运算符的 SO 似乎没有太多信息,所以希望这也可以帮助其他一些人。
c# - 为什么 `bool?` 上没有解除短路运算符?
为什么不bool?
支持解除&&
和||
?他们本可以解除true
andfalse
运算符,而这会间接添加解除&&
and ||
。
运算符|
和&
已经被解除并实现了正确的三值逻辑。||
但是,它们当然不会像和那样短路&&
。
问题是为什么他们决定在创建规范时不取消这些运算符。所以“就像这样,因为规范是这样说的”并不能回答“为什么?”。
举起时,true
既不是,也不是:false
null
true
false
这将导致&&
和||
行为就像它们的非短路对应物一样。除了false && anything
andtrue || anything
会短路(false
并且true
在这两个示例中没有编译时间常数)。
这与MSDN 上的 DBBool 示例非常相似。
我没有看到解除这些操作员带来的令人惊讶或危险的行为。我错过了什么?
我已经阅读了另一个关于此的 SO 问题,但没有一个令人满意的答案。
true
Jeff Yates 的回答显示了为什么提升/运算符不是最佳的一个很好的理由false
,它没有解释为什么提升&&
和||
直接是不好的。由于运算符提升是特殊情况下的编译器魔法,Nullable<T>
因此它不需要遵循普通类型的重载规则,因此能够提供&&
/||
不提升true
。
c# - 将 struct 与 null 进行比较时出现错误的编译器警告
考虑以下代码:
使用 Visual Studio 2010(C# 4、.NET 4.0),我收到以下警告:
警告 CS0458:表达式的结果始终为“布尔”类型的“空”?
这是不正确的;结果总是false
(类型bool
):
现在,结构 DateTime 重载了>
(大于)运算符。任何不可为空的结构(如 DateTime)都可以隐式转换为相应的Nullable<>
类型。上面的表达式完全等价于
这也会产生相同的错误警告。这里的>
算子是被提升的算子。HasValue
如果它的两个操作数中的任何一个是 ,则此方法通过返回 false 来工作false
。否则,提升的运算符将继续将两个操作数解包到底层结构,然后调用>
由该结构定义的重载(但在一个操作数没有的情况下,这不是必需的HasValue
)。
你能重现这个错误,这个错误是众所周知的吗?我误解了什么吗?
这对于所有int
重载相关运算符的结构类型(不是简单类型,如 ,而不是枚举类型)都是相同的。
(现在如果我们使用==
而不是>
,一切都应该完全相似(因为 DateTime 也重载了==
运算符)。但它不相似。如果我说
我没有收到任何警告 ☹ 有时你会看到人们不小心检查了一个变量或参数是否为 null,而没有意识到他们的变量的类型是一个结构(它重载==
并且不是一个简单的类型,比如int
)。如果他们得到警告会更好。)
更新:使用Visual Studio 2015的 C# 6.0 编译器(基于RoslynisGreater
),上面的不正确消息更改为带有正确且有用的警告消息的 CS0464。isEqual
此外,在 VS2015 的编译器中修复了上述缺少警告/features:strict
.
c# - 将裸空文字与用户定义的运算符一起使用时的奇怪重载解决方案
(标题中的“用户定义”是指加减法TimeSpan
和DateTime
不是C#标准的一部分。它们在BCL中定义。)
在可空值TimeSpan
和DateTime
值上使用提升运算符,我编写了以下代码。请注意,该框架在TimeSpan
和上提供了不同的操作DateTime
。
有一个对称的(和可交换的)加法,你取两个TimeSpan
并返回 sum TimeSpan
。这种加法的“逆”是两个相减TimeSpan
得到 a TimeSpan
。
然后是另一种加法,不对称,你需要一个DateTime
(左操作数)和一个TimeSpan
(右操作数)来产生一个DateTime
. 由于此操作的不对称性,它有两种“逆”:一种是您将两个相减DateTime
以获得TimeSpan
差异,另一种是您有一个DateTime
并从中减去一个TimeSpan
以产生结果DateTime
。
有些问题自然而然地出现。
o
允许并给出一个int?
(为什么不是long?
顺便说一句?)虽然是不允许的,这有点奇怪g
。这在规范中吗?c
此外,通过字符串连接解决“不可能”有点奇怪。显然编译器决定null
inc
是一个(string)null
. 另一方面,将显式类型的表达式添加object
到 a将不会编译。DateTime
但我的主要问题是:为什么编译器可以为d
and选择重载l
,但m
它抱怨歧义?
c# - 比较两个可空值
C# 5.0 规范在第 7.1.3 章中阅读
https://msdn.microsoft.com/en-us/library/ms228593.aspx
false
如果一个或两个操作数是,则提升的运算符产生值null
。
但是测试以及这个 MSDN 链接
http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx
表明比较两个都null
返回的可为空值true
。
这是有道理的,但它与规范中的句子相矛盾,不是吗?