C# におけるアクセス修飾子の一貫性とエラー対策

C# では、メソッドの戻り値の型とそのアクセス修飾子に一貫性がないと、以下のようなエラーが発生することがあります。

public CardType GetCardType()

上記のメソッドは public ですが、戻り値である CardType のアクセス修飾子が internal だと、
「アクセシビリティーに一貫性がない」 というエラーが発生します。

internal enum CardType  // internalアクセス修飾子
{
    Spade,
    Club,
    Heart,
    Diamond,
}

1. エラーの原因

これは、public なメソッドはアセンブリ外からもアクセス可能ですが、internal な型は同じアセンブリ内でしか使用できないため、 アクセス制御の不整合が生じるためです。

Windowsフォームアプリ(WinFormsアプリ)では、通常プロジェクトごとに1つのアセンブリとして考えます。


2. 解決策

エラーを解決する方法は以下の3つが考えられます。

解決策 1: CardTypepublic にする(推奨)

最も簡単な解決策は、CardType のアクセス修飾子を public に変更することです。

namespace InternalPublicSample
{
    public enum CardType  // internal → public に変更
    {
        Spade,
        Club,
        Heart,
        Diamond,
    }

    public partial class Form1 : Form
    {
        CardType cardType;

        public Form1()
        {
            InitializeComponent();
        }

        public CardType GetCardType() // これでエラーが解消
        {
            return cardType;
        }
    }
}

解決策 2: GetCardTypeinternal にする

もし CardTypeinternal のままにしたい場合は、GetCardTypeinternal に統一するとエラーが解消されます。

namespace InternalPublicSample
{
    internal enum CardType
    {
        Spade,
        Club,
        Heart,
        Diamond,
    }

    public partial class Form1 : Form
    {
        CardType cardType;

        public Form1()
        {
            InitializeComponent();
        }

        internal CardType GetCardType() // public → internal に変更
        {
            return cardType;
        }
    }
}

解決策 3: Form1internal にする

もし Form1 が外部で使われる必要がない場合、internal に変更することで GetCardTypepublic を維持できます。

namespace InternalPublicSample
{
    internal enum CardType
    {
        Spade,
        Club,
        Heart,
        Diamond,
    }

    internal partial class Form1 : Form // public → internal に変更
    {
        CardType cardType;

        public Form1()
        {
            InitializeComponent();
        }

        public CardType GetCardType() // これでOK
        {
            return cardType;
        }
    }
}

3. まとめ

解決策CardType の修飾子GetCardType の修飾子Form1 の修飾子メリット
CardTypepublic にする(推奨)publicpublicpublic最も簡単で確実
GetCardTypeinternal にするinternalinternalpublicCardTypeinternal のままにできる
Form1internal にするinternalpublicinternalForm1internal で済ませられる

最も簡単な方法は CardTypepublic にする ことです。
状況に応じて適切な方法を選択してください。

C#

Posted by hidepon