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

0 投票
2 回答
67 浏览

c# - 如何理解 ”?。” 实体框架源代码中的符号?

我正在研究Entity Framework源代码,?.在这个项目中发现了很多符号。我无法理解 的功能?.

例如,我们可以?.在下面找到符号DbContext.cs

0 投票
3 回答
328 浏览

c# - 如何使用条件空运算符来检查空字符串?

我正在尝试执行 LINQ to objects 查询,如下所示:

只要 CompanyName 不为空,它就可以正常工作。

所以,我认为这似乎是新的空条件运算符的理想场所!只需更改为:

一切都应该工作!

相反,我得到了错误:

我不太确定如何在这里完成我想要的。在这种情况下,我将如何使用 null 条件?

0 投票
4 回答
602 浏览

c# - 为什么我必须在空条件表达式周围放置 () 才能使用正确的方法重载?

我有这些扩展方法和枚举类型:

下面的第一个if编译;第二个没有:

它们仅因额外的一组括号而异。为什么我必须这样做?

起初我怀疑它是从bool?tobool然后返回到的双重隐式转换bool?,但是当我删除第一个扩展方法时,它抱怨没有隐式转换 from boolto bool?。然后我检查了IL,没有演员表。反编译回 C# 会产生如下所示的内容:

这对于我正在运行的 CLR 版本以及我的期望来说都很好。我没想到的是它x.Y?.Color.IsOneOf(Color.Red, Color.Green)不会编译。

到底是怎么回事?仅仅是语言的实现方式需要它()吗?

更新

这是在上下文中显示错误的屏幕截图。这让我更加困惑。这个错误实际上是有道理的;但是(现在在我看来)没有的是为什么第 18 行不会有同样的问题。

在此处输入图像描述

0 投票
1 回答
754 浏览

c# - 当 text 为空时, text?.IndexOf(ch) != -1 是否为 True?

观察:如果 text 为null,则此方法返回True。我期待False

当我使用 ILSpy(或检查 IL)反映上述行时,这是生成的代码:

这是我真正需要满足我的期望:

问题:有人对为什么 Null 条件代码生成OR表达式有很好的解释吗?

完整示例:https ://dotnetfiddle.net/T1iI1c

0 投票
3 回答
1198 浏览

c# - “空条件运算符短路”是什么意思?

未来访问者请注意:这个问题是基于错误的复制代码。?.操作员确实短路了。您现在可以关闭此浏览器选项卡。


网上有许多消息来源声称空条件运算符 ( ?.) 短路(例如http://www.informit.com/articles/article.aspx?p=2421572,搜索“电路”)。我无法检测到任何此类事情:

在这里,第一行因为第二?.行而起作用。第二个?.将 null 作为其第一个操作数,因此也返回 null。这不是短路。

显然,即使触发了 null 案例,链的其余部分也会执行。链没有中止。对我来说,短路意味着链条被中止。MSDN 声称是这种情况,但代码示例没有演示短路:

这种行为在 C# 6 开发周期中是否曾经改变过?这将解释网络上的不良来源。如果它不存在,为什么会有这么多关于短路的讨论?我可能在这里误解了一些东西。

不是重复的,因为它是关于操作员是否短路(答案:不,尽管接受的答案没有这么说)。这个候选人是关于可空布尔值和其他无关的。

0 投票
5 回答
372 浏览

c# - 为什么我可以将空条件运算符应用于硬编码字符串?

我有一个bool这样的变量:

如果我写if (myBool == null),我会收到以下警告:

表达式的结果始终为“false”,因为“bool”类型的值永远不会等于“bool?”类型的“null”。

这对我来说很清楚,因为检查不可为空的变量是否为空是没有意义的。Visual Studio 注意到这一点并将其标记为警告。

现在我有一个string,默认情况下可以为空,据我所知。

string为什么我可以在Visual Studio 没有注意到的情况下将空条件运算符应用于硬编码?我在想这样的事情:

Visual Studio 不应该注意到这string根本不是 null 吗?

0 投票
2 回答
8332 浏览

c# - 试图理解?C# 中的(空条件)运算符

我有这个非常简单的例子:

该行if (list?.Count > 0)编译完美,这意味着 if listis null,表达式默认Count > 0变为false

但是,该行if (a?.B)会引发编译器错误,提示我无法隐式转换bool?bool.

为什么一个与另一个不同?

0 投票
1 回答
178 浏览

c# - C#6 空条件运算符 - 作为代码切换器?

我已经知道空条件运算符 可用于在执行成员访问之前测试空值。

例如 :

如果customers是 null in customers?.Length ,那么customers?.Length 将返回 null 并且null将在int? length = ...变量中

我也知道它可以用于多线程环境中方法调用的单个原子操作:

AFAIU - 如果Foonull那么

也是null

所以我们只剩下

所以我问:

问题

似乎空条件运算符不仅用于测试空,如果有,那么它会更深入: x?.y?.c?.d -

但它也像代码切换一样:

像这样:

变成

我对吗?我没有找到这方面的任何文档。

0 投票
2 回答
5434 浏览

c# - 具有可为空 DateTimeOffset 的空条件运算符

环境: Visual Studio 2015

时区: : UTC + 7:00, 曼谷

问题:在 DateTimeOffset 可为空的变量(DateTimeOffset?)上,使用 Null 条件运算符会导致异常,即即使值为 NULL,它仍会调用该方法,即(值作为 DateTimeOffset?)?.ToLocalTime(),它调用 ToLocalTime 和导致异常。

查询:我可以通过不使用 Null 条件运算符或使用 GetValueOrDefault 而不是运算符来解决它,但我想了解为什么它会在所有 UTC + TimeZones 中出现异常,它适用于 UTC - TimeZones

代码:

在此处输入图像描述

编辑

我知道有很多方法可以修复代码,即

这是我的查询,当我不使用空条件运算符时

它不会导致异常。是不是因为空条件运算符根据以下博客展开变量

http://www.ninjacrab.com/2016/09/11/c-how-the-null-conditional-operator-works-with-nullable-types/

我更感兴趣的是理解为什么当我使用空条件运算符时它会中断,而当我使用'as'运算符而不使用 DateTimeKind.Utc 进行简单转换时它会起作用

编辑2

这是 DateTimeOffset(.NET 框架代码)的构造函数,它在 ValidateOffset 方法处中断。来源- http://referencesource.microsoft.com/#mscorlib/system/datetimeoffset.cs,68b4bb83ce8d1c31

0 投票
1 回答
384 浏览

c# - 为什么设置布尔值时可以使用空条件运算符而不使用可为空的布尔值?

我有以下代码行:

Exists左侧是User类的属性。它的类型是just bool,not bool?Exists右侧的方法是一个 API 方法,用于检查给定实体是否存在于存储库中。它返回Task<bool>。我想首先检查存储库是否为空,所以我使用空条件运算符。我认为如果存储库为空,那么整个右侧将只返回空,它不能分配给bool类型,但编译器似乎可以接受。它只是以某种方式默认为错误值吗?