【发布时间】: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 我想它是为了显示差异。
-
这是出乎意料的行为 :) 我的问题不是关于现实世界的实用性,而是关于满足期望和在某处被指定(因此是面向未来的)