标签: null-conditional-operator

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

我已经知道在执行成员访问之前,可以使用 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)

c# c#-6.0 null-conditional-operator

4
推荐指数
1
解决办法
172
查看次数

否定null条件运算符会返回意外结果

如果变量值为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)

vb.net null-conditional-operator

4
推荐指数
1
解决办法
110
查看次数

为什么null条件运算符对==和.Equals()的行为不同?

我有以下代码,工作正常:

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)

但我很好奇为什么编译器不喜欢第一个空条件语法.

c# c#-6.0 null-conditional-operator

3
推荐指数
1
解决办法
549
查看次数

为什么IEnumerable不行?第一个()工作?

当我尝试在可枚举对象上使用?.First()时,当对象不包含任何项时,它会抛出错误"sequence contains no elements".

我认识到解决方案是使用.FirstOrDefault(),但我不明白为什么我原来的努力不起作用.我误解了某些东西还是只是"其中一件事"?

c# visual-studio null-conditional-operator

3
推荐指数
2
解决办法
532
查看次数

UnassignedReferenceException 即使使用空条件运算符

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)

我究竟做错了什么?这不是运营商的用途吗?

谷歌搜索没有帮助。

c# unity-game-engine null-conditional-operator

3
推荐指数
1
解决办法
990
查看次数

空条件和ToString一起提供意外结果

我有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

c# null-conditional-operator

3
推荐指数
1
解决办法
79
查看次数

当空条件运算符短路时,它是否仍然评估方法参数?

null条件运算符可用于跳过null目标上的方法调用.在这种情况下是否会评估方法参数?

例如:

myObject?.DoSomething(GetFromNetwork());
Run Code Online (Sandbox Code Playgroud)

什么GetFromNetwork时候myObjectnull

c# c#-6.0 null-conditional-operator

2
推荐指数
1
解决办法
299
查看次数

为什么 Visual Studio 不会就空引用异常向我发出警告?

我想知道为什么 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 不会抱怨第一个版本。当然,我错过了关于这段代码的真实性质的一些东西。

c# nullable tostring null-conditional-operator

2
推荐指数
1
解决办法
275
查看次数

C# 6.0 if 语句中的空条件运算符

有人可以解释一下 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 的转换?

c# linq null-conditional-operator

2
推荐指数
2
解决办法
110
查看次数

有没有更短的方法可以用 C# 8 编写此代码?

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

2
推荐指数
1
解决办法
137
查看次数