问题标签 [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.

0 投票
4 回答
826 浏览

c# - System.Nullablenull * int 值的值是多少?

考虑以下陈述:

的价值是 v2多少?(null或空字符串?)

如何防止编译器将其标记为无效操作?我需要遵循自定义异常处理吗?

0 投票
2 回答
13082 浏览

c# - 什么是提升运算符?

我正在看这篇文章,并且正在努力遵循解释提升运算符的 VB.NET 示例。似乎没有等效的 C# 示例或教程。一般来说,我在运算符重载方面没有太多经验,因此在阅读可空类型的同时尝试与 VB.NET 等价物达成协议可能不是最好的起点......

任何人都可以提供对提升运算符的解释以及它们是如何被可空类型使用的吗?这是否只是意味着可空类型本身不会重载运算符,而是会使用它所代表的基础类型中的运算符?

关于提升运算符的 SO 似乎没有太多信息,所以希望这也可以帮助其他一些人。

0 投票
3 回答
1043 浏览

c# - 为什么 `bool?` 上没有解除短路运算符?

为什么不bool?支持解除&&||?他们本可以解除trueandfalse运算符,而这会间接添加解除&&and ||

运算符|&已经被解除并实现了正确的三值逻辑||但是,它们当然不会像和那样短路&&

问题是为什么他们决定在创建规范时不取消这些运算符。所以“就像这样,因为规范是这样说的”并不能回答“为什么?”。

举起时,true既不是,也不是:falsenulltruefalse

这将导致&&||行为就像它们的非短路对应物一样。除了false && anythingandtrue || anything会短路(false并且true在这两个示例中没有编译时间常数)。

这与MSDN 上的 DBBool 示例非常相似。

我没有看到解除这些操作员带来的令人惊讶或危险的行为。我错过了什么?

我已经阅读了另一个关于此的 SO 问题,但没有一个令人满意的答案。


trueJeff Yates 的回答显示了为什么提升/运算符不是最佳的一个很好的理由false,它没有解释为什么提升&&||直接是不好的。由于运算符提升是特殊情况下的编译器魔法,Nullable<T>因此它不需要遵循普通类型的重载规则,因此能够提供&&/||不提升true

0 投票
3 回答
1073 浏览

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.

0 投票
1 回答
131 浏览

c# - 将裸空文字与用户定义的运算符一起使用时的奇怪重载解决方案

(标题中的“用户定义”是指加减法TimeSpanDateTime不是C#标准的一部分。它们在BCL中定义。)

在可空值TimeSpanDateTime值上使用提升运算符,我编写了以下代码。请注意,该框架在TimeSpan和上提供了不同的操作DateTime

有一个对称的(和可交换的)加法,你取两个TimeSpan并返回 sum TimeSpan。这种加法的“逆”是两个相减TimeSpan得到 a TimeSpan

然后是另一种加法,不对称,你需要一个DateTime(左操作数)和一个TimeSpan(右操作数)来产生一个DateTime. 由于此操作的不对称性,它有两种“逆”:一种是您将两个相减DateTime以获得TimeSpan差异,另一种是您有一个DateTime并从中减去一个TimeSpan以产生结果DateTime

有些问题自然而然地出现。

o允许并给出一个int?(为什么不是long?顺便说一句?)虽然是不允许的,这有点奇怪g。这在规范中吗?c此外,通过字符串连接解决“不可能”有点奇怪。显然编译器决定nullinc是一个(string)null. 另一方面,将显式类型的表达式添加object到 a将不会编译。DateTime

但我的主要问题是:为什么编译器可以为dand选择重载l,但m它抱怨歧义?

0 投票
2 回答
114 浏览

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

这是有道理的,但它与规范中的句子相矛盾,不是吗?

0 投票
0 回答
50 浏览

c# - 可空值类型上的提升运算符是否使用短路?

我想知道这样的代码是否应该执行GetAnotherValue()

我认为这不应该,因为这对我来说听起来更合理。但我不确定这是否得到保证。据我所知,规范没有说明这一点。

编辑:

我发现了更多关于表达式主题的规范文档。不过还不清楚。

似乎提升的运算符将两个操作数都转换为可空等效项,然后检查空值并在需要时调用原始运算符。

这意味着我的GetAnotherValue()方法将被执行,以生成int?提升比较的第二个值。我对这种解释是否正确?