C#中受保护的静态字符串可访问性问题

bpe*_*kes 2 c# generics

我有一个模板化的抽象基类.

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另一方面是一个静态保护功能,这个问题就不存在了,这使得整个事情更加不清楚.

Eri*_* J. 7

为什么可以Derived1访问受保护的静态成员Derived2

MAGIC是一个共同的基类,而不是Derived2.任何子类Base<T>都会看到一个同名的变量,但如果T每个派生类的变量不同,它实际上将是不同的变量.

我认为静态构造函数在访问任何静态成员之前运行,为什么当我访问时Derived2.MAGIC,我没有看到它的静态构造函数被调用?

没有声明Derived2.MAGIC,有声明Base<T>.MAGIC.Derived1正在访问在其自己的基类中声明的受保护字段.

你是从假设MAGIC被宣布开始的Derived2.如果你改变你的代码实际上是这样的话,你的期望就会成立.

  • 从技术上讲,不是'Derived2.MAGIC`与`Base <Other2> .MAGIC`相同,因为泛型类型具有基于泛型参数的不同静态实例?IOW`Derived2.MAGIC`和`Derived1.MAGIC`是不同的静态变量? (3认同)
  • @DStanley正是如此.如果你有'Derived3:Base <Other2>`,它的MAGIC字段将与Derived2 MAGIC字段相同.但是Derived1的MAGIC字段是不同的,因为它是`Base <Other1>`的字段. (2认同)