次の方法で共有


コンパイラ エラー CS0051

アクセシビリティに一貫性がありません:パラメーターの型 'type' はメソッド 'method' よりもアクセシビリティが低い

このエラーは、メソッド自体よりもアクセスしにくいパラメーター型を持つメソッド (コンストラクターを含む) を宣言するときに発生します。 たとえば、パラメーター型として内部クラスまたはプライベート クラスを使用するパブリック コンストラクターがあるとします。

最も一般的なシナリオは、パブリック メソッドを定義するが、そのパラメーター型の 1 つが内部またはプライベートである場合です。 外部コードはメソッドを参照できますが、呼び出しに必要な型にアクセスできないため、不整合が発生します。

このエラーのトラブルシューティング方法

  1. 問題の原因となっているパラメーターの型を特定します。エラー メッセージを確認して、アクセスが少ないパラメーターの種類を確認します。
  2. パラメーター型のアクセシビリティを確認します。IDE でパラメーターの型を右クリックし、[定義に移動] を選択して (または F12 キーを押して) 宣言方法を確認します。
  3. アクセシビリティ レベルを比較する: パラメーターの型が、少なくともそれを使用するメソッドと同じくらいアクセス可能であることを確認します。

例示

例 1: プライベート パラメーター型の Public メソッド

次の例では CS0051 が生成されます。メソッド F はパブリックですが、パラメーター型 B はプライベートであるためです。

// CS0051.cs
public class A
{
    // B is implicitly private here.
    class B
    {
    }

    public static void F(B b)  // CS0051
    {
    }

    public static void Main()
    {
    }
}

例 2: 内部パラメーター型のパブリック コンストラクター

これは、パブリック コンストラクターがあるが、パラメーター型が内部である一般的なシナリオです。

// Another file or assembly.
internal class DatabaseConfiguration
{
    public string ConnectionString { get; set; }
}

// In your main class.
public class DataService
{
    // This causes CS0051 because the constructor is public.
    // but DatabaseConfiguration is internal.
    public DataService(DatabaseConfiguration config)  // CS0051
    {
        // Implementation.
    }
}

このエラーを解決するには

次のいずれかの方法を使用します。

  1. パラメーター型のアクセシビリティを高める: メソッドのアクセシビリティに合わせて、または超えるようにパラメーターの型を変更します。

    public class A
    {
        // Make B public to match the accessibility of method F.
        public class B
        {
        }
    
        public static void F(B b)  // Now works correctly
        {
        }
    }
    
  2. メソッドのアクセシビリティを下げる: パラメーターの型と一致するメソッドのアクセシビリティを低くします。

    public class A
    {
        class B  // B remains private.
        {
        }
    
        // Make F internal or private to match B's accessibility.
        internal static void F(B b)  // Now works correctly
        {
        }
    }
    
  3. よりアクセシビリティの高いインターフェイスまたは基底クラスを使用する: アクセシビリティの低い型を直接使用する代わりに、パブリック インターフェイスまたは基底クラスを使用します。

    public interface IConfiguration
    {
        string ConnectionString { get; }
    }
    
    internal class DatabaseConfiguration : IConfiguration
    {
        public string ConnectionString { get; set; }
    }
    
    public class DataService
    {
        // Use the public interface instead.
        public DataService(IConfiguration config)  // Works correctly
        {
            // Implementation.
        }
    }
    

こちらも参照ください