使用struct和properties时没有编译错误

时间:2017-02-01 14:16:08

标签: c# .net compiler-errors roslyn

考虑C#中的以下结构:

public struct TestStruct
{
    public int Number { get; set; }

    public TestStruct(int num)
    {
        Number = num;
    }
}

我非常熟悉编译错误,如果尝试编译它会发生(thisthat问题提供示例)。

但是,我最近注意到这种结构在Visual Studio 2015中完美编译。

我无法找到编译器的任何更改日志,其中包括上述行为。任何人都可以提供任何指导,以找到这些信息的位置?我发现有类似here的提及。

此外,有关编译器错误CS0188的页面指出:

  

结构中应避免使用自动实现的属性,因为它们没有支持字段,因此无法以任何方式从构造函数初始化。

但是,我无法观察到无法从构造函数初始化属性。

1 个答案:

答案 0 :(得分:4)

这是C#6中的新功能(默认情况下,您将在VS2015中使用它)。该编译器错误的描述也不严格正确。自动属性总是有一个支持字段,它只是由编译器生成,而不是直接从代码中访问。所以这有点误导。

C#中对自动属性初始化的更改现在允许编译器生成代码来设置支持字段,而不是尝试在构造函数中调用setter方法。这也使创建不可变结构更容易:

public struct Foo
{
    public string ReadOnlyString { get; }

    public Foo( string prop )
    {
        ReadOnlyString = prop;
    }
}