Cs0051-ös fordítási hiba

Inkonzisztens akadálymentesség: a "type" paramétertípus kevésbé hozzáférhető, mint a metódus

Ez a hiba akkor fordul elő, ha olyan metódust deklarál (beleértve a konstruktorokat is), amelynek paramétertípusa kevésbé elérhető, mint maga a metódus. Előfordulhat például, hogy egy nyilvános konstruktor egy belső vagy privát osztályt használ paramétertípusként.

A leggyakoribb forgatókönyv egy nyilvános metódus definiálása, de annak egyik paramétertípusa belső vagy privát. Ezzel inkonzisztencia jön létre, mert a külső kód látja a metódust, de nem tudja elérni a meghíváshoz szükséges típusokat.

A hiba elhárítása

  1. Azonosítsa a problémát okozó paramétertípust: Tekintse meg a hibaüzenetet, és nézze meg, hogy melyik paramétertípus kevésbé érhető el.
  2. Ellenőrizze a paramétertípus akadálymentességét: Kattintson a jobb gombbal a paramétertípusra az IDE-ben, és válassza az "Ugrás a definícióra" lehetőséget (vagy nyomja le az F12 billentyűt) a deklarált állapot megtekintéséhez.
  3. Az akadálymentességi szintek összehasonlítása: Győződjön meg arról, hogy a paraméter típusa legalább olyan akadálymentes, mint az azt használó módszer.

Példák

1. példa: Nyilvános metódus privát paramétertípussal

A következő minta a CS0051-et hozza létre, mert a metódus F nyilvános, de a paraméter típusa B privát:

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

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

    public static void Main()
    {
    }
}

2. példa: Belső paramétertípusú nyilvános konstruktor

Ez egy gyakori forgatókönyv, amelyben nyilvános konstruktor van, de a paraméter típusa belső:

// 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.
    }
}

A hiba kijavítása

Válasszon az alábbi módszerek közül:

  1. A paramétertípus akadálymentesebbé tétele: Módosítsa a paramétertípust úgy, hogy megfeleljen vagy meghaladja a metódus akadálymentességét:

    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. A metódus akadálymentességének csökkentése: A metódus akadálymentesítése a paramétertípusnak megfelelően:

    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. Akadálymentesebb felület vagy alaposztály használata: A kevésbé akadálymentes típus közvetlen használata helyett használjon nyilvános felületet vagy alaposztályt:

    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.
        }
    }
    

Lásd még