0

这是一个来自 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>
4

3 回答 3

4

protected意味着它在类本身之外不可见,仅在类本身或派生类中可见。

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

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

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

于 2014-06-25T07:59:32.300 回答
3

阅读访问修饰符的定义,您将得到答案。

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

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

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

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

于 2014-06-25T08:04:29.680 回答
0

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

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

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

于 2014-06-25T08:08:04.093 回答