【问题标题】:Access specifier in details [duplicate]详细访问说明符[重复]
【发布时间】:2014-09-09 04:31:00
【问题描述】:
using System;

namespace Protected_Specifier
{
  class access
   {
 // String Variable declared as protected
 protected string name;
 protected internal string FirstName;
 public void print()
  {
    Console.WriteLine("\nMy name is " + name);
  }
  public void print1()
  {
    Console.WriteLine("\nMy Firstname is " + FirstName);
  }
   }

 class Program : access // Inherit access class
   {
 static void Main(string[] args)
  {
    //Program p=new Program();
    access a=new access();
    Console.Write("Enter your name:\t");
    a.name = Console.ReadLine(); //error
    a.FirstName = Console.ReadLine();//no error
    a.print();
    a.print1();
    Console.ReadLine();
  }
   }
 }

我对继承有一个疑问。在这种情况下,如果我们使用基类的实例,则它不适用于受保护的内部,而它正在用于受保护的内部。请告诉我原因.....

【问题讨论】:

  • 您能否提供一个不起作用但应该起作用的代码示例?听起来您是在说您无法从成员方法访问受保护的变量,但事实并非如此。
  • 我认为 OP 正试图从 Program 类中的 access 类中访问 name 变量。这个编译时错误非常好问题。
  • @SudhakarTillapudi 这也是我的想法,但我唯一能想到的可能是问题是他试图从@987654325 中的静态方法访问(非静态)成员变量@.
  • 对于未来的问题,请明确说明您的期望。 IE。当前导致编译时错误的行上的// No Error!! 并不是解释您的意思的最明显方式。

标签: c#


【解决方案1】:

如果您的问题是您无法通过基类实例访问基类中的 name 字段,是的,这就是 protected 修饰符的工作原理。

它需要一个派生类型的实例才能访问受保护的成员。

示例取自msdn

基类的受保护成员可在派生类中访问 仅当通过派生类类型进行访问时。例如, 考虑以下代码段:

class A
{
    protected int x = 123;
}

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

        // Error CS1540, because x can only be accessed by 
        // classes derived from A. 
        // a.x = 10;  

        // OK, because this class derives from A.
        b.x = 10;
    }
}

语句 a.x = 10 会产生错误,因为它是在静态方法 Main 中生成的,而不是 B 类的实例。

【讨论】:

  • 我知道。但是为什么我们不能使用基类实例访问?
  • @Kireet 我无法比eric lippert更好地解释这一点
猜你喜欢
  • 2012-06-05
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多