我正在使用 NET 5.0 测试 c# 9.0,但有些东西我不明白。我启用了<nullable>enable</nullable>.
如果我写一堂课
public class Potato {
public string Colour { get; set; }
public string Flavour { get; set; }
}
我收到警告CS8618: Non-nullable propery 'Colour' must contain a non-null value when existing constructor. Consider declaring the propery as nullable.我不想声明它可以为空,这就是我启用标签的原因......
然后,我声明构造函数:
public class Potato
{
public Potato(string colour, string flavour)
{
this.Colour = colour;
this.Flavour = flavour;
}
public string Colour { get; set; }
public string Flavour { get; set; }
}
到现在为止还挺好。现在我想Potato使用对象初始化器创建一个对象:
var sweetPotato = new Potato {
Colour = "orange",
Flavour = "tasty",
};
现在我得到了抱怨CS7036: There is no argument given that corresponds to the required formal parameter 'colour' of 'Potato.Potato(string, object)。因此,它尝试使用我明确声明但我没有引入参数的构造函数。我应该做:
var sweetPotato = new Potato(
colour: "orange",
flavour: "tasty");
但在这里我没有使用对象初始化程序。
另一种选择是将类声明为
public class Potato
{
public string Colour { get; set; } = null!;
public string Flavour { get; set; } = null!;
}
与null!元素,但这允许一些奇怪的事情,如:
var sweetPotato = new Potato()
{
Colour = "orange",
};
我认为这非常奇怪。我声明了 2 个不可为空的属性,并且由于null!我可以使用一个属性加载对象,但不能加载第二个属性。这打破了我的可空标签!
那么我的问题是:如果启用了可空标记,是否可以使用具有不可空属性的对象初始化程序?
如果不是,我认为对于具有不可为空属性的类,不null!涉及任何内容,默认构造函数不应该是空的,而是具有所有参数的,并且应该可以使用对象初始化器来初始化对象形式,只要所有不可为空的属性都已初始化。