2015-06-26 101 views
22

我的理解是現在允許使用結構體中的無參數構造函數。C#結構中的無參數構造函數6

但下面給我一個編譯錯誤,在2015年VS社區

public struct Person 
{ 
    public string Name { get; } 
    public int Age { get; } 
    public Person(string name, int age) { Name = name; Age = age; } 
    public Person() : this("Jane Doe", 37) { } 
} 

錯誤:「的Structs不能包含明確的參數構造函數」

任何人都知道爲什麼嗎?

+0

此鏈接似乎表明它應該在VS 2015中用C#6工作:http://www.c-sharpcorner.com/UploadFile/0e8478/parameterless-constructors-in-structs/不知道爲什麼它不起作用爲你。 –

+0

這是另一篇文章,有一些注意事項:http://www.volatileread.com/Wiki/Index?id=1091但沒有解釋你的特定問題。您是否檢查過以確保您的項目針對的是項目設置中的.NET 6.0框架? –

回答

38

該功能出現在C#6.0的舊版預覽中,這就是爲什麼一些文章談論它。但是它被刪除了,所以在VS 2015 RC發行的版本中不存在。

具體而言,更改已在pull request #1106中恢復,有關issue #1029中基本原理的更多信息。引用弗拉基米爾Sadov:

As we performed more and more testing, we kept discovering cases where parameterless struct constructors caused inconsistent behavior in libraries or even in some versions of CLR.

[…]

After reconsidering the potential issues arising from breaking long standing assumptions, we decided it was best for our users to restore the requirement on struct constructors to always have formal parameters.

+0

有趣的是:雖然該功能已從C#中刪除,但它保存在[tag:vb.net]中,可以在那裏使用。 OP的代碼示例轉換爲VB(所有構造函數都有名稱'New')。 – miroxlav

+0

@miroxlav [我不認爲這是真的。](http://stackoverflow.com/q/32179495/41071) – svick

+1

哦,我明白了,雖然沒有明確說明,但這個問答只討論*非靜態*。靜態無參數'struct'構造函數在C#和VB中都可以工作。 (經測試。) – miroxlav

0

我不知道爲什麼,但是,這是允許的:

public struct Person 
{ 
    public string Name { get; } 
    public int Age { get; } 
    public Person(string name = null, int age = 0) { Name = name; Age = age; } 
} 

這是否解決問題了嗎?

+6

你定義的構造函數不會被調用,如果你不使用任何參數,請參見[這裏](https://stackoverflow.com/questions/27145633/unintuitive-behaviour-with-struct-initialization-and-default-arguments ?LQ = 1) – gartenriese