misc.log

日常茶飯事とお仕事と

C#でスコープの宣言を省略するとprivateになる(涙)

新人研修用の課題として、C#で継承クラスを作りカスタマイズ、DLLにして配布してみるというのをやろうとしたのですが……下記のソースでやってみたところ、クラスライブラリーのプロジェクトではフォームデザイナーのツールボックスにアイコンが出てくるのに、DLLにして配布参照した先では出てこないという現象が……。

class CustomButton1 : Button
{
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        if (this.BackColor == SystemColors.Control)
        {
            // 初期色の場合は黄色に変える
            this.BackColor = Color.Yellow;
        }
        else
        {
            // 初期色でない場合は初期色に変える
            this.BackColor = SystemColors.Control;
        }
    }
}

こんな感じでどうでも良い色変えロジックを実装してボタンを作ってみたのですが、DLLにして別プロジェクトで参照してもツールボックスにはCustomButton1が出てこず。また、ツールボックスを右クリックして「アイテムの選択」からDLLを指定すると

'C:\works\lib\CustomControls.dll'にはツールボックスに配置できるコンポーネントが何もありません。

こんなエラーがでてやはりツールボックスには出てきません。どういうことだろう?と思ったら答えはアホみたいなものでした。

「クラスの宣言にスコープ指定がないのでprivate扱いになっている」

です。クラスの宣言部分に「public」をつけたらうまくいきました。そう、こんな感じですね。ついつい忘れがちなので気をつけましょう。

public class CustomButton1 : Button
{
    protected override void OnClick(EventArgs e)
    {


C# 7.0 Pocket Reference: Instant Help for C# 7.0 Programmers