web-dev-qa-db-ja.com

C#6の構造体のパラメーターなしのコンストラクター

私の理解では、構造体のパラメータなしのコンストラクタが許可されるようになりました。

しかし、以下はVS 2015 Communityでコンパイルエラーを表示します

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) { } 
}

エラー:「構造体に明示的なパラメーターなしのコンストラクターを含めることはできません」

誰もがなぜ知っていますか?

28
myfunnyfella

この機能はC#6.0の古いプレビューに存在していたため、一部の記事でこの機能について説明しています。しかし、その後削除されたため、VS 2015 RCで配布されたバージョンには存在しません。

具体的には、変更は pull request#1106 で元に戻され、根拠についての詳細は issue#1029 にあります。ウラジミール・サドフの引用:

テストを行うたびに、パラメーターのないstructコンストラクターがライブラリーやCLRの一部のバージョンでさえも一貫性のない動作を引き起こすケースを発見し続けました。

[…]

長期にわたる仮定を破ることから生じる潜在的な問題を再検討した後、structコンストラクターが常に正式なパラメーターを持つという要件を復元することがユーザーにとって最善であると判断しました。

42
svick