在C#(以及许多其他语言)中,访问相同类型的其他实例的私有字段是完全合法的.例如:
public class Foo
{
private bool aBool;
public void DoBar(Foo anotherFoo)
{
if (anotherFoo.aBool) ...
}
}
Run Code Online (Sandbox Code Playgroud)
由于C#规范(第3.5.1,3.5.2节)规定对私有字段的访问属于类型,而不是实例.我一直在与同事讨论这个问题,我们试图找出它之所以如此工作的原因(而不是限制对同一个实例的访问).
我们可以提出的最佳参数是进行相等性检查,其中类可能希望访问私有字段以确定与另一个实例的相等性.还有其他原因吗?或者一些绝对意味着它必须像这样或某种东西工作的黄金理由是完全不可能的?
这段代码:
abstract class C
{
protected abstract void F(D d);
}
class D : C
{
protected override void F(D d) { }
void G(C c)
{
c.F(this);
}
}
Run Code Online (Sandbox Code Playgroud)
生成此错误:
无法通过类型为"C"的限定符访问受保护的成员'CF(D)'; 限定符必须是'D'类型(或从中派生)
他们在想什么?(会改变那条规则会破坏某些东西吗?)除了让F公开之外,还有其他方法吗?
编辑:我现在明白为什么会这样(感谢格雷格),但我仍然对理性感到有些困惑; 给定:
class E : C
{
protected override void F(D d) { }
}
Run Code Online (Sandbox Code Playgroud)
为什么不应该 D是能够能够调用EF?
编辑错误消息,所以我可能会在那里输入错误.
我写了以下代码:
public class A
{
protected string Howdy = "Howdy!";
}
public class B : A
{
public void CallHowdy()
{
A a = new A();
Console.WriteLine(a.Howdy);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在VS2010其中导致以下编译错误:
无法通过"A"类型的限定符访问受保护的成员"Aa"; 限定符必须是'B'类型(或从中派生).
这对我来说似乎很不合逻辑 - 为什么我不能protected从类的方法访问类实例的字段,这是从它派生的?
那么,为什么会这样呢?
找到了严格的答案 - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx