为什么调用此列表方法会返回不可访问性错误?

时间:2017-01-25 17:10:43

标签: c# list debugging methods compiler-errors

我似乎遇到了一个我以前从未遇到过的错误:

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#中实施Eratosthenes筛选。我相信我已经很好地掌握了算法的逻辑,并且在值上使用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;
    }
}

现在,当我尝试在GeneratePrimes中调用Main方法时,我告诉EratoPrimes.GeneratePrimes(int) is inaccessible due to its protection level。为什么会这样,我该如何纠正该计划?

2 个答案:

答案 0 :(得分:2)

默认情况下,没有显式访问修饰符的方法是私有的,因此只能在其指定的类中访问。

如果您要按照定义使用它,可以考虑使用public访问修饰符和static关键字对其进行修饰:

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

这将执行以下操作:

  • public - public访问修饰符将允许您在当前EratosPrimes课程之外访问您的方法。

  • static - static关键字将允许它不需要同一个类的实例,因此就像您当前使用EratosPrimes.GeneratePrimes()一样调用它。没有它,您需要创建EratosPrimes类的实例,然后在该实例上调用GeneratePrimes()方法(即new EratosPrimes().GeneratePrimes(42);

答案 1 :(得分:2)

因为您确实在方法签名中提供了访问修饰符,并且默认情况下该方法在C#中为private,如果要从中访问它,则需要添加public修饰符在此课程之外,以及您调用它的方式,您还需要通过添加static关键字来static。{/ p>

因此,您的方法签名将变为:

public static List<int> GeneratePrimes(int limit)