我有以下课程:
namespace Bla.Bla
{
public abstract class ClassA
{
public virtual void Setup(string thing)
{
}
public abstract bool IsThingValid();
public abstract void ReadThings();
public virtual void MatchThings() { }
public virtual void SaveThings() { }
public void Run(string thing)
{
Setup(thing);
if (!IsThingValid())
{
}
ReadThings();
MatchThings();
SaveThings();
}
}
}
namespace Bla.Bla
{
public class ClassB : ClassA
{
ClassB() { }
public override void IsThingValid()
{
throw new NotImplementedException();
}
public override void ReadThings()
{
throw new NotImplementedException();
}
}
}
现在我尝试执行以下操作:
public class ClassC
{
public void Main()
{
var thing = new ClassB();
ClassB.Run("thing");
}
}
返回以下错误:由于其保护级别,ClassB无法访问。
但他们都是公开的。
答案 0 :(得分:81)
此错误是ClassB
的构造函数的保护级别的结果,而不是ClassB
本身的保护级别。由于构造函数的名称与类 * 的名称相同,因此可能会错误地解释错误。由于您未指定构造函数的保护级别,因此默认情况下假定为internal
。声明构造函数public
将解决此问题:
public ClassB() { }
* 也可以说构造函数没有名称,只有一个类型;这并没有改变问题的本质。
答案 1 :(得分:3)
此外,如果您想执行ClassB.Run("thing");
之类的操作,请确保方法Run();
为static
,或者您可以这样称呼它:thing.Run("thing");
。
答案 2 :(得分:0)
您可以进入网络表单的设计者并更改" webcontrols"成为公共"而不是"受保护"但我不确定那是多么安全。我更喜欢隐藏输入并让一些jQuery将值设置为隐藏的输入,然后在Web表单的类(后面的代码)中创建公共属性,并以这种方式访问值。