質問: VB.NETやC#の構造体において、デフォルトコンストラクタを定義できない理由を教えてください。 引数付きのコンストラクタが定義できるのに、デフォルトコンストラクタが定義できないのが不思議です。
回答: 少しだけ深い話をしたいと思うのですが、 > > The .NET runtime can't guarantee that parameterless constructors will be called. If structs where to allow default, parameterless constructors, it would imply that these default constructors would *always* be called. However, the runtime can not make this guarantee. For example an array of value types will be initialized to the initial values of its members (i.e. 0 for number type primitive members, null for reference types etc) not to the values provided in a default constructor - which makes structs better performing by not having to call constructor code. Enforcing a minimum of one parameter in the constructor reduces the possibility that someone will define a constructor that they then expect to be called every time one of their struct types is constructed. > > > .NET Runtime では、デフォルトコンストラクタが呼ばれることを保証できません。もし許してしまえば常にデフォルトコンストラクタが呼ばれることになります。デフォルトコンストラクタを呼ばないことでパフォーマンスが上がります。引数を一つ以上に制限することで、コンストラクタの定義の手間を省くことができます、と言っています。 > > Although the CLR allows it, C# does not allow structs to have a default parameterless constructor. The reason is that, for a value type, compilers by default neither generate a default constructor, nor do they generate a call to the default constructor. So, even if you happened to define a default constructor, it will not be called and that will only confuse you. > > > CLR ではデフォルトコンストラクタの定義を許しています。 C# の構造体では ``` struct MyStrstrcut { int i=10; //illegal } ``` のようなフィールドの初期化が許されない為、必ず全てのフィールドを初期化する引数つきのコンストラクタを定義する必要がある。デフォルトコンストラクタを定義できるとユーザを混乱させてしまうから禁止しているんだ、と言っています。 ひょっとしたらもっと深い話を希望されているかもしれませんが、結局は言語設計者の方針として、コンストラクタの定義の手間を減らしたい、ユーザの混乱を減らしたい、パフォーマンスを上げたいということがあるからではないでしょうか。