【问题标题】:C#: default literal and type inference on nullable structsC#:可空结构的默认文字和类型推断
【发布时间】:2021-05-25 17:39:36
【问题描述】:

从 C# 7.1 开始,可以在不指定类型的情况下使用 default 获取默认值。我今天试了一下,发现可空结构和可空值类型的结果有些违反直觉。

[TestFixture]
public class Test
{
    private class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    [Test]
    public void ShouldBehaveAsExpected()
    {
        var person1 = new Person {Name = "John", Age = 58};
        var person2 = new Person {Name = "Tina", Age = 27};

        var persons = new[] {person1, person2};

        int? myAge = persons.FirstOrDefault(p => p.Name == "MyName")?.Age;
        var myDefaultAge = myAge ?? default;

        var myAgeString = myAge == null ? "null" : myAge.ToString();
        var myDefaultAgeString = myDefaultAge == null ? "null" : myDefaultAge.ToString();

        Console.WriteLine("myAge: " + myAgeString);                 // "myAge: null"
        Console.WriteLine("myDefaultAge: " + myDefaultAgeString);   // "myDefaultAge: 0"

    }
}

我本来希望myDefaultAge 是null 而不是0,因为myAge 的类型是int? 而default(int?) 是null。

此行为是否在任何地方指定? C# programming guide 仅表示“默认文字产生的值与等效的 default(T) 相同,其中 T 是推断的类型。”

【问题讨论】:

  • var myDefaultAge = myAge ?? default; 这条线的意义何在?您正在检查myAge 是否不为空,因此它不能为null,因此默认为default(int)。您可以通过var myDefaultAge = myAge ?? default(int?); 手动指定或仅var myDefaultAge = myAge;
  • @SeM 我想它是为了显示差异。
  • 这是出乎意料的行为 :) 我的问题不是关于现实世界的实用性,而是关于满足期望和在某处被指定(因此是面向未来的)

标签: c# nullable c#-7.1


【解决方案1】:

它记录在null-coalescing operator:

表达式的类型 a ?? b 取决于操作数上可用的隐式转换。按优先顺序,a 的类型?? b 是 A0、A 或 B,其中 A 是 a 的类型(前提是 a 有类型),B 是 b 的类型(前提是 b 有类型),如果 A是可以为空的类型

在这里准确描述了我们的情况 - A 可以为空,default 没有类型。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多