Why are private fields not private to the instance?

In C# it’s perfectly legitimate to access private fields of other instances of the same type. C# specification also state that access to private fields is on a type, not an instance. Is there any reason for that?

public class Foo
{
    private bool aBool;

    public void DoBar(Foo anotherFoo)
    {
        if(anotherFoo.aBool) ...
    }
}

One reason for this is that, access modifiers work at compile time. As such, determining whether or not a given object is also the current object isn’t easy to do.

Another reason for this is that, the purpose of encapsulation is to lower mutual dependence of different pieces of code (classes in C# and Java), not different objects in memory.

For example, if you write code in one class that uses some fields in another class, then these classes are very tightly coupled. However, if you are dealing with code in which you have two objects of the same class, then there is no extra dependency. A class always depends on itself.

Source: stackoverflow.com