c# 9.0 记录和可空​​性

c# 9.0 records and nullability

我正在使用最新的 .Net5 试用新的记录功能

  public record Rec {
    public string Name;
    public int Id;
    //public Rec(string name, int id) => (Name, Id) = (name, id);
  }

我明白了

warning CS8618: Non-nullable field 'Name' is uninitialized. Consider declaring the field as nullable.

所以没有生成构造函数,而我知道这是记录的一个特征?
为什么 Id 的警告不同?
如果我取消标记上面的 ctor,警告就会消失(这是有道理的)

另外,如果我这样做:

public record Rec(string Name, int Id);

没有警告。

编辑

所以创建记录的两种形式(较长语法与较短语法)似乎不同,较短的版本使字段 public 并且还添加了一个构造函数,而第一个没有。我找不到对此的引用。

So a constructor is not generated whereas I understood that is a feature of records ?

根据the documentation:为位置记录的参数列表的所有值参数合成一个主构造函数。

您的第一个示例没有参数列表,因此没有值参数,因此它不是位置记录,因此它没有主构造函数。

and why not the same warning for Id ?

因为 default constructor for int 一直是 0,而不是 null。这并不是 record 特有的,自从 C# 1.0.

之前就一直如此