C#: литерал по умолчанию и вывод типа на обнуляемые структуры

Начиная с 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# сказано только, что "литерал по умолчанию выдает то же значение, что и эквивалентное значение по умолчанию (T), где T - предполагаемый тип".

1 ответ

Решение

Это задокументировано для оператора с нулевым слиянием:

Тип выражения b зависит от того, какие неявные преобразования доступны для операндов. В порядке предпочтения, тип b - это A0, A или B, где A - это тип a (при условии, что a имеет тип), B - это тип b (при условии, что b имеет тип), а A0 - базовый тип A, если A обнуляемый тип

Точно описывает нашу ситуацию здесь - A обнуляем, default не имеет типа.

Другие вопросы по тегам