【发布时间】:2021-09-15 09:35:14
【问题描述】:
为什么我没有在构造函数中设置 FieldTwo 时没有收到不可为空的警告(或其他警告)?我正在使用 .Net 5.0 并且在项目文件中将 Nullable 选项设置为 true。
public class MyClass
{
public string FieldOne;
public long FieldTwo;
public MyClass (string p1, long p2)
{
FieldOne = p1;
// FieldTwo is not set. Where is the non-nullable warning!?
}
}
【问题讨论】:
-
谢谢。无论如何,这里有编译器警告吗?我不希望它默认为
0,我希望编译器强制我从构造函数中的参数设置值 -
long是一个值类型,它永远不能为空。您没有可空性警告。这些是字段,而不是属性,长类型字段的值为 0。您必须使用 long 吗?能够存储空值。这将生成一个Nullable<long> 字段,它可以接受空值 -
所以编译器实际上没有办法告诉程序员他们犯了一个错误,他们忘记在构造函数中显式设置 PropertyTwo 字段?
-
由于
long不可为空,因此适用于值类型的通常规则:如果您在构造函数中不做任何事情,它会使用default进行初始化,这意味着它以0结束。这个决定(以及不需要显式初始化,甚至警告它的决定)一直追溯到 C# 的第一个版本,并且与可空性问题正交(应用程序在访问具有值 @ 的long时不会崩溃987654330@,毕竟,虽然它可能会出现故障)。 -
@cdimitroulas 这里真正的错误是调用字段
Property。字段是实现细节。是的,有一些方法可以要求所有属性中的值,例如使用Required属性,或者在C# 8 及更高版本中,使用record。你想做什么?