我已经知道在执行成员访问之前,可以使用 null条件运算符 来测试 null.
例如 :
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];
Run Code Online (Sandbox Code Playgroud)
如果customers为null customers?.Length ,则customers?.Length 返回null,这null将是int? length = ...变量
我也知道它可以用于多线程环境中方法调用的单个原子操作:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
但
AFAIU - 如果Foo是的null话
Foo?.Invoke(this, EventArgs.Empty);
Run Code Online (Sandbox Code Playgroud)
也是 null
所以我们离开了
public void OnFoo()
{
null; //compilation error
}
Run Code Online (Sandbox Code Playgroud)
所以我问:
题
似乎空条件运算符是不是仅用于测试空,如果有,那么它进行更深层次的: x?.y?.c?.d -
但它也像代码切换一样:
像这样:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty); //Let's …Run Code Online (Sandbox Code Playgroud) 如果变量值为Nothing,我们会遇到null条件运算符的意外行为.
以下代码的行为让我们有点困惑
Dim l As List(Of Object) = MethodThatReturnsNothingInSomeCases()
If Not l?.Any() Then
'do something
End If
Run Code Online (Sandbox Code Playgroud)
Not l?.Any()如果l没有条目或者l什么都没有,那么预期的行为是真实的.但如果l没有什么结果是假的.
这是我们用来查看实际行为的测试代码.
Imports System
Imports System.Collections.Generic
Imports System.Linq
Public Module Module1
Public Sub Main()
If Nothing Then
Console.WriteLine("Nothing is truthy")
ELSE
Console.WriteLine("Nothing is falsy")
End If
If Not Nothing Then
Console.WriteLine("Not Nothing is truthy")
ELSE
Console.WriteLine("Not Nothing is falsy")
End If
Dim l As List(Of Object)
If l?.Any() Then
Console.WriteLine("Nothing?.Any() is truthy")
ELSE
Console.WriteLine("Nothing?.Any() is …Run Code Online (Sandbox Code Playgroud) 我有以下代码,工作正常:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name == "href";
Run Code Online (Sandbox Code Playgroud)
我想使字符串比较不区分大小写,所以我将其更改为:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
现在编译器给了我一个错误:
运算符&&不能应用于'bool'和'bool?'类型的操作数
我可以通过合并到false来修复错误
bool isHref = token.Children().Count() == 1
&& (firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase) ?? false);
Run Code Online (Sandbox Code Playgroud)
但我很好奇为什么编译器不喜欢第一个空条件语法.
当我尝试在可枚举对象上使用?.First()时,当对象不包含任何项时,它会抛出错误"sequence contains no elements".
我认识到解决方案是使用.FirstOrDefault(),但我不明白为什么我原来的努力不起作用.我误解了某些东西还是只是"其中一件事"?
UnassignedReferenceException: The variable _Preset of Foo has not been assigned.即使我使用的是空条件运算符, 我也得到了一个?.。
我的代码:
// […]
myTarget.Preset?.ApplyTo(myTarget);
Run Code Online (Sandbox Code Playgroud)
我还注意到它提到了_Preset而不是Preset(我觉得很奇怪)。
代码Foo.cs:
[CreateAssetMenu()]
public class Foo : ScriptableObject
{
[SerializeField] private Preset _Preset = null;
public Preset Preset
{
get { return _Preset; }
protected set { _Preset = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?这不是运营商的用途吗?
谷歌搜索没有帮助。
我有2条使用空条件(?)运算符并在结果上执行ToString的语句。这两个语句似乎应该具有相同的结果,但事实并非如此。唯一的不同是一个包含括号,另一个不包含括号。
using System.Diagnostics;
using System.Net;
namespace ByPermutationConsole
{
class Program
{
static void Main(string[] args)
{
SomeClass someClass = default(SomeClass);
// Why do these evaluate differently?
//
// (someClass?.StatusCode).ToString() is equal to an empty string
//
// someClass?.StatusCode.ToString() is equal to null
//
}
}
public class SomeClass
{
public HttpStatusCode StatusCode { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这两个语句的评估结果相同。
(someClass?.StatusCode).ToString() == someClass?.StatusCode.ToString()
Run Code Online (Sandbox Code Playgroud)
但是,它们不:
(someClass?.StatusCode).ToString() 等于 string.Empty
和someClass?.StatusCode.ToString()等于null
null条件运算符可用于跳过null目标上的方法调用.在这种情况下是否会评估方法参数?
例如:
myObject?.DoSomething(GetFromNetwork());
Run Code Online (Sandbox Code Playgroud)
什么GetFromNetwork时候myObject叫null?
我想知道为什么 Visual Studio 2019 没有抱怨这段 C# 代码:
dynamic deserializedBody = JsonConvert.DeserializeObject(requestBody);
deserializedBody?.date.ToString();
Run Code Online (Sandbox Code Playgroud)
既然deserializedBody?.date可能null,就意味着该ToString方法将应用于某事null。我认为是这样的:
deserializedBody?.date?.ToString();
Run Code Online (Sandbox Code Playgroud)
将是正确的使用形式,但 Visual Studio 不会抱怨第一个版本。当然,我错过了关于这段代码的真实性质的一些东西。
有人可以解释一下 if 语句中空条件运算符的逻辑吗?
想象一下下面的代码
List<string> items = null;
if (items?.Count == 0)
{
Console.WriteLine("error");
}
else
{
Console.WriteLine("OK");
}
Run Code Online (Sandbox Code Playgroud)
以上将打印OK。为什么它在下一个块不会编译时编译?
if (items?.Any()) // won't compile but if (items?.Count() == 0) would
{
...
}
Run Code Online (Sandbox Code Playgroud)
我猜?。当检测到 null 并且跳过整个 if 时将停止执行,但为什么“?.Any()”不是这种情况?仅仅因为它是一种方法而“count”是一种属性?
为什么 Linq 扩展方法 Any() 需要从 Nullable 到 bool 的显式转换,其中 Count() == 0 编译时不需要 Nullable 到 int 的转换?
if (value2 != null)
{
value1 = value2;
}
Run Code Online (Sandbox Code Playgroud)
?和??运算符在这里似乎没有用。我想到使用三元运算符。
value1 = (value2 != null) ? value2 : value1;
Run Code Online (Sandbox Code Playgroud)
看起来不太好。有更短的路吗?
.net c# null null-coalescing-operator null-conditional-operator