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.
之前就一直如此
我正在使用最新的 .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.