【问题标题】:Error: Inaccessible due to its protection level错误:由于其保护级别而无法访问
【发布时间】:2014-08-15 16:34:28
【问题描述】:

这是一个来自 MSDN 的示例,来自解释“受保护”成员访问修饰符的部分。我的问题是,如果我像示例 II 那样修改这个程序,为什么会出现编译错误,

示例一

class A
{
    protected int x = 123;
}

class B : A
{
    static void Main()
    {
        A a = new A();
        B b = new B();

        b.x = 10;
    }
}

示例二

class A
{
    protected int x = 123;
}

//MODIFICATION IN BELOW 2 LINES
class B : A{}
class program
{
    static void Main()
    {
        A a = new A();
        B b = new B();

        b.x = 10;
    }
}

示例 II 的编译器错误:

d:\MyProgs>csc _13protected.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

_13protected.cs(14,15): error CS0122: 'A.x' is inaccessible due to its
        protection level
_13protected.cs(3,23): (Location of symbol related to previous error)

d:\MyProgs>

【问题讨论】:

  • 这不是在您获得代码 snippet 的完全相同的地方解释的吗?
  • 据说那里。 protected 保护变量只能由它自己的类和派生类使用。 class program 两者都不是,因此您无法从class program 访问变量x。因此你会得到一个适当的编译错误。

标签: c# protected-resource


【解决方案1】:

阅读access modifiers的定义,你会得到答案。

public:该类型或成员可以被同一程序集中的任何其他代码或引用它的其他程序集访问。

private:该类型或成员只能被同一类或结构中的代码访问。

受保护:该类型或成员只能由同一类或结构中的代码或从该类派生的类中的代码访问。

internal:同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问。

【讨论】:

    【解决方案2】:

    您需要注意访问受保护字段的实际类。

    在第二个示例中,您尝试从程序类访问 b.X,这是“受保护”修饰符不允许的,因为程序类不继承自 A。

    另一方面,在第一个示例中,对 b.X 的实际访问发生在从 A 继承的 B 类中,因此“受保护”修饰符允许访问。

    【讨论】:

      【解决方案3】:

      protected 表示它在类本身之外不可见,仅在类本身或派生类中可见。

      在您的第一个示例中它有效,因为您的 main 方法是派生类的一部分。

      在您的第二个示例中,您试图访问其类外部的受保护成员,这是不可能的。如果你想让这成为可能,x 应该声明为public

      有关protected 含义的更多信息,请参阅http://msdn.microsoft.com/en-us/library/bcd5672a.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-26
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多