C#:默认文字和可空结构的类型推断

Jan*_*Jan 3 c# nullable c#-7.1

从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"

    }
}
Run Code Online (Sandbox Code Playgroud)

我本来期望myDefaultAgenull不是0,因为myAge的类型是int?default(int?)null

是否在任何地方指定了此行为?的C#编程指南只说“的默认文字产生相同的值作为等效默认(T),其中T为推断出的类型。”

Dam*_*ver 5

它记录在null运算符中

表达式的类型 b取决于操作数上可用的隐式转换。按照优先顺序,类型为??。b是A0,A或B,其中A是a的类型(假设a具有类型),B是b的类型(假设b具有类型),并且A0是A的基础类型(如果A是可为空的类型

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