C #: литерал по умолчанию и вывод типа на обнуляемые структуры - PullRequest
3 голосов
/ 14 марта 2019

Начиная с 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 Ответ

5 голосов
/ 14 марта 2019

Это задокументировано для оператора null-coalescing :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...