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

时间:2019-03-14 08:50:28

标签: 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"

    }
}

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

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

1 个答案:

答案 0 :(得分:5)

已记录到null-coalescing operator

  

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

此处准确地描述了我们的情况-A可为空,default没有类型。