49

我有以下课程:

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 由于其保护级别而无法访问。

但它们都是公开的。

4

3 回答 3

111

此错误是ClassB' 的构造函数的保护级别的结果,而不是ClassB其本身。由于构造函数的名称与类*的名称相同,因此可能会错误地解释错误。由于您没有指定构造函数的保护级别,因此internal默认情况下是这样。声明构造函数public将解决这个问题:

public ClassB() { } 

*也可以说构造函数没有名称,只有类型;这并没有改变问题的本质。

于 2013-08-23T13:41:52.847 回答
3

此外,如果您想做类似的事情ClassB.Run("thing");,请确保方法Run();static,或者您可以这样称呼它:thing.Run("thing");.

于 2013-08-23T14:26:28.123 回答
0

您可以进入 Web 表单的设计器并将“webcontrols”更改为“public”而不是“protected”,但我不确定这有多安全。我更喜欢制作隐藏输入并让一些 jQuery 将值设置到这些隐藏输入中,然后在 Web 表单的类(代码隐藏)中创建公共属性,并以这种方式访问​​这些值。

于 2016-07-20T18:45:42.107 回答