我似乎遇到了一个我以前从未遇到过的错误:
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
。为什么会这样,我该如何纠正该计划?
答案 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)