我有一个模板化的抽象基类.
public abstract class Base<T> where T : new()
{
protected static string MAGIC;
}
Run Code Online (Sandbox Code Playgroud)
然后,我有两个类派生Base,但具有不同的值T.
public class Derived1:Base<Other1> {}
public class Derived2:Base<Other2> {}
Run Code Online (Sandbox Code Playgroud)
似乎发生了两件奇怪的事情.首先,Derived2.MAGIC可以从一个成员函数中获得Derived1; 我不指望那样.另外,Derived2有一个静态构造函数设置MAGIC; 奇怪的是,访问Derived2时不会调用静态构造函数(甚至不应该允许).Derived1Derived2.MAGIC
两个问题:
为什么可以Derived1访问受保护的静态成员Derived2?
我认为静态构造函数在访问任何静态成员之前运行,为什么当我访问时Derived2.MAGIC,我没有看到它的静态构造函数被调用?
这两个似乎都是严重的错误.
只是添加一个注释,如果MAGIC另一方面是一个静态保护功能,这个问题就不存在了,这使得整个事情更加不清楚.
为什么可以
Derived1访问受保护的静态成员Derived2?
MAGIC是一个共同的基类,而不是Derived2.任何子类Base<T>都会看到一个同名的变量,但如果T每个派生类的变量不同,它实际上将是不同的变量.
我认为静态构造函数在访问任何静态成员之前运行,为什么当我访问时
Derived2.MAGIC,我没有看到它的静态构造函数被调用?
没有声明Derived2.MAGIC,有声明Base<T>.MAGIC.Derived1正在访问在其自己的基类中声明的受保护字段.
你是从假设MAGIC被宣布开始的Derived2.如果你改变你的代码实际上是这样的话,你的期望就会成立.