2017-01-25 3 views
0

Ich habe scheinen in einen Fehler zu laufen, dass ich noch nie in vorher laufen:Warum ruft diese Listenmethode einen Unzugänglichkeitsfehler auf?

main.cs(9,48): error CS0122: `EratoPrimes.GeneratePrimes(int)' is inaccessible due to its protection level 
main.cs(15,15): (Location of the symbol related to previous error) 
Compilation failed: 1 error(s), 0 warnings 

exit status 1 

Hintergrund: Ich versuche, das Sieb des Eratosthenes in C# zu implementieren. Ich glaube, ich habe die Logik des Algorithmus ziemlich gut, und habe es mit einer Console.WriteLine() Schleife über die Werte (ohne die Liste der Primzahlen) getestet.

Hier ist, was ich habe:

using System; 
using System.Collections.Generic; 

public class EratoSieve{ 
    public static void Main(string[] args){ 
     List<int> desired_primes = EratoPrimes.GeneratePrimes(100); 
    } 
} 

public class EratoPrimes{ 
    List<int> GeneratePrimes(int limit){ 
     // set up indexed array of candidates: 
     int[,] first_array = new int[limit,2]; 
     for(int i=0; i<limit; i++){ 
      first_array[i,0] = i; 
      first_array[i,1] = 1; 
     } 
     first_array[0,1] = 0; 
     first_array[1,1] = 0; 

     // set up list for primes: 
     List<int> primes = new List<int>(){2}; 

     // begin Sieve: 
     for(int a=2; a < limit; a++){ 
      if(first_array[a,1]==1){ 
       primes.Add(first_array[a,0]); 
       for(int b = a*a; b < limit; b+=a){ 
        first_array[b,1]=0; 
       } 
      } 
     } 
     /* test to see indexed array: 
     for(int k=0; k<limit; k++){ 
      Console.WriteLine(first_array[k,0]+" "+first_array[k,1]); 
     } 
     */ 
     return primes; 
    } 
} 

Nun, wenn ich die GeneratePrimes Methode in Main zu nennen versuchen, mir wurde gesagt, dass EratoPrimes.GeneratePrimes(int) is inaccessible due to its protection level. Warum ist das der Fall und wie kann ich das Programm korrigieren?

Antwort

2

Standardmäßig sind Methoden ohne expliziten Zugriffsmodifikator privat und daher nur innerhalb ihrer angegebenen Klasse zugänglich.

Wenn Sie wollen, es zu benutzen, wie Sie definiert haben, könnten Sie halten es mit dem public Zugriffsmodifikator die Dekoration und das static Stichwort:

public static List<int> GeneratePrimes(int limit){ ... } 

Dies wird wie folgt vorgehen:

  • public - Der Zugriffsmodifizierer public ermöglicht den Zugriff auf Ihre Methode außerhalb Ihrer aktuellen Klasse EratosPrimes.

  • static - Das Schlüsselwort static ermöglicht es, keine Instanz derselben Klasse zu benötigen und es so aufzurufen, wie Sie es gerade verwenden EratosPrimes.GeneratePrimes(). Ohne sie würde müssen Sie eine Instanz Ihrer EratosPrimes Klasse erstellen und dann rufen Sie die GeneratePrimes() Methode für diese Instanz (dh new EratosPrimes().GeneratePrimes(42);)

+0

Danke. Nachdem ich ähnliche Fragen über SO nachgeschlagen hatte (bevor ich diese Frage gestellt habe), wusste ich, dass die Lösung etwas damit machen musste, die Methode öffentlich zu machen. Das brachte nur andere Probleme bei der Kompilierung, und erst als ich deine (und Ehsans) gelesen habe. Vorschlag, 'static' hinzuzufügen, dass es funktioniert hat. Ich werde Ihre Antwort wählen, da Sie erklärt haben, warum ich 'static' hinzufügen sollte. – daOnlyBG

2

Da Sie den Zugriffsmodifizierer in den Methodensignaturen bereitgestellt did'nt, und durch Standard ist die Methode private in C#, müssen Sie public Modifizierer hinzufügen, wenn Sie von außerhalb dieser Klasse darauf zugreifen möchten, und die Art, wie Sie es aufrufen, müssen Sie es auch static durch Hinzufügen des Schlüsselwortes static machen.

So Ihre Methode Signaturen werden:

public static List<int> GeneratePrimes(int limit) 
Verwandte Themen