为什么类实例的私有成员在Equals()方法体中可用?

pen*_*ake 10 .net c# oop clr equals

可能重复:
为什么我的私人可以访问?
为什么私有字段属于该类型,而不是实例?

很可能我错过了一个明显的事实,但我不能真正看到原因:

当我重写Equals()方法并将对象转换为我的类型时,我可以毫无问题地调用私有成员!

我正在初始化一个实例,我希望它的私有成员不可访问.

但是为什么铸造的对象在Equals()方法中向我开放了它的私有部分?

请参阅下面示例代码中的Equals实现,并了解我如何到达"that"实例上的私有字段:

 public class Animal
 {
     private string _name;
     private int _age;

     public Animal(int age, string name)
     {
         _name = name;
         _age = age;
     }

     public override bool Equals(object obj)
     {
         var that = (Animal) obj;


         //_name and _age are available on "that" instance
         // (But WHY ??? )
         return
             this._age == that._age
             && this._name == that._name; 

     }
 }


    class Program
    {
        static void Main(string[] args)
        {
            var cat1 = new Animal(5, "HelloKitty");
            var cat2 = new Animal(5, "HelloKitty");

            Console.Write(cat1.Equals(cat2));
            Console.Read();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 18

私有成员是类的私有成员,而不是实例.

在Animal类中,您可以访问您传递的任何Animal实例的任何私有成员(或者,在这种情况下,成功转换为).

  • 为了澄清OP,这种行为与`Equals()`方法没有任何关系; 在这方面并不特别.在`Animal`上定义的任何方法(包括静态方法)都可以访问给定的任何`Animal`对象上的私有成员. (5认同)

Fis*_*rdo 8

私有成员是可用的,因为它们是类的私有,而不是实例.因为您在Animal类中,所以您可以访问私有成员,甚至是不同的实例.

以下是此语言功能的先前讨论的链接:为什么私有字段属于该类型,而不是实例?