CS5L11——CSharp 9 功能和语法

目标类型化 new

在已知变量类型的情况下,使用 new​ 实例化对象时可以直接省略掉 new​ 关键字后面的类型,使变量的赋值语句变得更简单
相比 var​,它可以不仅可以用于临时变量初始化时,还可以用于类的成员变量以及对变量的重新赋值的情况

实际上,new()​ 在所有可以推导出类型的上下文中,都可以使用,包括在初始化器内部,只要能够确定赋值类型是什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test {}

class Program
{
List<int> numbers = new();
Test obj = new();
static Dictionary<string, List<Test>>? testDict;

static void Main()
{
testDict = new()
{
{"111", new() { new() }}, //这里的第一个new()是List<Test>,后面的new()是Test
{"222", new() { new(), new() }}, //这里的第一个new()是List<Test>,后面的new()是Test
};
}
}

不适用此特性的场景包括:

  • 该方法不适用于里氏替换,也就是父类装子类的情况,new​ 的子类必须显式指定,否则会出现歧义!

  • 使用 as​ 操作时无法正确推导,以 int​ 为例

    1
    Console.Write(new() as int);     // error: "new()" 没有目标类型
  • 使用 var​ 时也无法推导

    1
    var x = new();    // error: "new()" 没有目标类型