【问题标题】:no default constructor and automatic property, how come it still compiles没有默认构造函数和自动属性,怎么还能编译
【发布时间】:2019-06-03 07:45:14
【问题描述】:

我是 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() 调用默认构造函数的情况下对我来说编译得很好? 另一个问题是为什么同样的规则不适用于类?你能有一个没有默认构造函数的自动属性吗?

【问题讨论】:

  • 结构总是有一个默认的构造函数。
  • 我可能错了,但 IIRC 有旧版本的 C#,除非您添加 : this(),否则它不会编译。但是...由于分配给自动道具显然确实分配给了该字段,IIRC 现在可以让您使用。试图找出何时/如果这发生了变化。引文 - 这是一篇关于它不起作用工作的博客:techiesimon.com/2014/01/16/… - 编辑,它是 C# 6 - stackoverflow.com/a/420441/23354
  • 你想做什么?防止调用者创建无效值?还是阻止创建默认值?结构是值类型,因此它们始终具有非空默认值和默认构造函数。检查 C# 编程指南中的Using Structs
  • @Panagiotis Kanavos 你能检查一下我帖子中的原始问题,看看为什么原作者确实收到了编译错误
  • 附带说明:可变结构是一个糟糕的主意; public readonly struct SomeStruct { public string StringProperty {get;} public int Int32Property {get;} public SomeStruct(string stringProperty, int int32Property) { StringProperty = stringProperty; Int32Property = int32Property; }} 你会好多

标签: c# .net oop


【解决方案1】:

最终,结构在作为一个完整值被触及之前对明确的赋值有严格的规则(this 访问所必需的);在 C# 6 之前,编译器没有将构造函数中的自动属性视为明确赋值的一部分,因此调用属性设置器的访问被认为是无效的。从 C# 6 开始,它确实如此(将自动属性视为 struct 构造函数中明确赋值的一部分),因此所示代码现在有效。

因为它是有效的(对于任何最近的编译器,即使您将语言级别设置为早于 C# 6),它会编译。

但请注意,这仅适用于构造函数内部。以下内容仍然无效(尽管它适用于裸字段):

SomeStruct x;
x.StringProperty = "abc"; // CS0165 Use of unassigned local variable x
x.IntProperty = 123;
SomeMethod(x);

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2020-08-29
    • 2013-03-20
    • 2016-06-05
    • 2016-10-16
    • 2023-03-20
    • 2016-07-18
    • 2010-10-24
    相关资源
    最近更新 更多