なんでだろう?

ちょっと今日はまったことのメモ。

VS2005・C#でWindowsアプリを作ってたときに起きたこと。

(Visual C# 2008 Express Editionで確認しても同じ現象がおきました。)

Buttonクラスを継承したボタンクラスを作ろうと思って以下のように定義した。

internal class HogeButton : System.Windows.Forms.Button
{
    internal HogeButton() : base() { }
}

で、これをツールボックスから選択してデザイナに貼り付ける(名前:hogebutton1)。

でビルド。

以下のエラーが出る。

フィールド 'SampleAppli.Form1.hogeButton1' は割り当てられません。常に既定値 null を使用します。

フォームのデザイナファイルを見てみると、hogebutton1を宣言しているとこはあるけど以下の部分がない。

this.hogeButton1 = new HogeButton();

手で書いてビルドすると正常に完了する。

でもボタンの位置を移動させるなどデザイナファイルに変更をかけて

ビルドをするとデザイナファイルの上記の部分が消えてしまう。

でごにょごにょやってわかったのは

コンストラクタのアクセス修飾子を「internal」から「public」に変更してビルドすると

上記のような現象は起こらないということ。

なんでインスタンス化するコードが消えてしまうんだろう…。

消すこたぁないじゃないか!

ググってもそれらしい情報が見当たらないし…うーん。