考虑这个示例代码:
public class A<T>
{
public static T TheT { get; set; }
}
public class B : A<string>
{
static B() {
TheT = "Test";
}
}
public class Program {
public static void Main(String[] args) {
Console.WriteLine(B.TheT);
}
}
Here B.TheT
一片空白。然而,改变Main
像这样的方法:
public static void Main() {
new B();
Console.WriteLine(B.TheT);
}
B.TheT
正如预期的那样,是“测试”。我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况?
我尝试阅读规范,这引起了我的注意(§10.12):
[...] 静态构造函数的执行由第一个构造函数触发
应用程序域内发生以下事件:
• [...]
• 引用类类型的任何静态成员。
我对此的解释是,自从TheT
不是以下成员B
,静态构造函数B
不强制运行。它是否正确?
如果这是正确的,我最好怎么让B
指定如何初始化TheT
?
正如预期的那样,A.TheT 是“测试”。我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况?
基本上,你还没有really引用的B
。如果你查看 IL,我想你会发现你的代码实际上相当于:
public static void Main(String[] args) {
Console.WriteLine(A<string>.TheT);
}
编译器计算出这是really你指的成员,即使你写了B.TheT
.
如果这是正确的,我最好如何让 A 指定如何初始化 TheT?
老实说,我会尽量避免从一开始就这样做......但你总是可以添加一个静态方法B
:
public static void Initialize() {
// Type initializer will be executed now.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)