2017-01-25 6 views
0

私は前に実行したことがないエラーに遭遇しているように見えるしました:このリストメソッドを呼び出して、アクセスできないエラーが返されるのはなぜですか?

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 

背景:私はC#でエラトステネスのふるいを実装しようとしています。私はアルゴリズムのロジックがかなり良くなっていると思っており、値の上にConsole.WriteLine()ループ(素数のリストを返さずに)を使ってテストしました。ここで

は私が持っているものです。

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

さて、私はMainGeneratePrimesメソッドを呼び出すようにしようとしたとき、私は聞いていEratoPrimes.GeneratePrimes(int) is inaccessible due to its protection levelいます。なぜこれが当てはまるのですか?プログラムを修正するにはどうしたらいいですか?

答えて

2

デフォルトでは、明示的なアクセス修飾子を持たないメソッドはprivateであるため、指定されたクラス内でしかアクセスできません。あなたが定義したとして、それを使用したい場合、あなたはpublicアクセス修飾子とstaticキーワードとそれを飾る検討することもでき

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

これは、次の操作を行います:

  • public - publicアクセス修飾子を使用すると、現在のEratosPrimesクラス以外のメソッドにアクセスできます。

  • static - staticキーワードは、同じクラスのインスタンスを必要としないため、現在使用しているとおりにEratosPrimes.GeneratePrimes()を呼び出すことができます。それがなければ、あなたはあなたのEratosPrimesクラスのインスタンスを作成する必要があり、あなたがメソッドのシグネチャでは、とすることにより、アクセス修飾子を提供did'ntので、その後(すなわちnew EratosPrimes().GeneratePrimes(42);

+0

ありがとうございました。 (この質問をする前に)SOの同様の問題を調べたところ、この方法を「公開」して何かをしなければならないことが分かっていました。それはちょうど他の編集問題を返しました。それが働いた「静的」を加える提案。なぜ私は '静的'を追加すべきかを説明したので、私はあなたの答えを選びます。 – daOnlyBG

2

そのインスタンス上GeneratePrimes()メソッドを呼び出しますデフォルトではメソッドはprivateです。このクラスの外部からアクセスする場合は、public修飾子を追加する必要があります。staticキーワードを追加することによって、staticにする必要があります。

だからあなたのメソッドのシグネチャはなります:

public static List<int> GeneratePrimes(int limit) 
関連する問題