我是 C# 新手,只是关于默认构造函数和自动属性的问题。基于 stackoverflow 上的一个问题: How can I set the value of auto property backing fields in a struct constructor?
所以我们有以下结构
public struct SomeStruct
{
public SomeStruct(String stringProperty, Int32 intProperty)
{
this.StringProperty = stringProperty;
this.IntProperty = intProperty;
}
public String StringProperty { get; set; }
public Int32 IntProperty { get; set; }
}
但是为什么它在不通过 :this()
调用默认构造函数的情况下对我来说编译得很好?
另一个问题是为什么同样的规则不适用于类(class)?你可以有一个没有默认构造函数的自动属性吗?
最佳答案
最终,结构在可以作为整个值进行访问之前,对明确的赋值有严格的规则(这是 this
访问所必需的);在 C# 6 之前,编译器不会将构造函数中的自动属性视为明确赋值的一部分,因此调用属性 setter 的访问被视为无效。从 C# 6 开始,确实如此(将自动属性视为结构构造函数中明确赋值的一部分),因此所示的代码现在有效。
因为它是有效的(对于任何最新的编译器,即使您设置的语言级别早于 C# 6),它也会编译。
但请注意,这仅适用于构造函数内部。以下内容仍然无效(尽管它适用于裸字段):
SomeStruct x;
x.StringProperty = "abc"; // CS0165 Use of unassigned local variable x
x.IntProperty = 123;
SomeMethod(x);
关于c# - 没有默认构造函数和自动属性,为什么它仍然可以编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423055/