Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未从派生类调用c#静态构造函数 类总线 { 静态总线() { foreach(类型为(T).GetFields()的字段信息fi) { if(fi.FieldType==typeof(参数)) { fi.SetValue(typeof(T),新参数(“busyname”,“busyvalue”); } } } } 班车:公共汽车 { 公共静态参数域; }_C#_Inheritance_Static Constructor - Fatal编程技术网

未从派生类调用c#静态构造函数 类总线 { 静态总线() { foreach(类型为(T).GetFields()的字段信息fi) { if(fi.FieldType==typeof(参数)) { fi.SetValue(typeof(T),新参数(“busyname”,“busyvalue”); } } } } 班车:公共汽车 { 公共静态参数域; }

未从派生类调用c#静态构造函数 类总线 { 静态总线() { foreach(类型为(T).GetFields()的字段信息fi) { if(fi.FieldType==typeof(参数)) { fi.SetValue(typeof(T),新参数(“busyname”,“busyvalue”); } } } } 班车:公共汽车 { 公共静态参数域; },c#,inheritance,static-constructor,C#,Inheritance,Static Constructor,有没有什么办法可以让这项工作正常进行,从而使对Buss中静态字段的引用触发Bus中的静态构造函数?事实上,这对您很重要,这可能意味着您使用的静态构造函数是错误的 记住这一点,您可以在Bus中创建一个静态构造函数,手动调用Bus中的静态构造函数。请注意,不可能多次运行静态构造函数。注意“静态构造函数不会被继承”。我猜这类似于静态字段,它们也不是继承的 引用泛型类型时,泛型类型的静态构造函数在每个类型中只调用一次 调用Buss x=new Buss()将调用Bus的静态构造函数 调用Bus x=ne

有没有什么办法可以让这项工作正常进行,从而使对Buss中静态字段的引用触发Bus中的静态构造函数?

事实上,这对您很重要,这可能意味着您使用的静态构造函数是错误的


记住这一点,您可以在
Bus
中创建一个静态构造函数,手动调用
Bus
中的静态构造函数。请注意,不可能多次运行静态构造函数。

注意“静态构造函数不会被继承”。我猜这类似于静态字段,它们也不是继承的

引用泛型类型时,泛型类型的静态构造函数在每个
类型中只调用一次

调用
Buss x=new Buss()
将调用
Bus
的静态构造函数

调用
Bus x=new Bus()
也将调用
Bus
的静态构造函数,但它会为其类型参数
Buss
,设置
Buss.field

如果创建一个
类Bugs:Bus
,它将永远不会设置
Bugs.field
,因为它将首先解析类型参数
Buss
,该参数调用它的基类
Bus
,设置
Buss.field
。当它试图调用
bug
基类的静态构造函数时,它会认为它已经调用了静态
Bus
构造函数并跳过它

基本上,如果我复制粘贴您的代码,创建一个伪
参数
类并创建一个
总线
的新实例,就会调用静态构造函数,并将
总线字段
设置为
参数
的实例,但我确实认识到了一些奇怪的行为,在这些行为中,我不得不建议不要使用静态方法的反射来达到子类的静态


您提供的示例之所以有效,是因为
Buss
本身就是类型参数。

为什么是静态构造函数?静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。“field”是静态数据,只需初始化一次,因此不能直接调用static constructors.static constructor。我意识到“错”可能意味着我的OOP已关闭。但是,我觉得能够继承静态成员(包括静态构造函数)实际上更面向对象。@adt:只要引用任何静态字段或方法,它就会被隐式调用。您能直接调用静态构造函数吗?@adt:不显式,但调用它是可以完成的,就像我提到的那样。“未继承的静态字段”:我的代码中有
类T1{publicstaticstrings1=“s1”}类T2:T1{void f(){Console.WriteLine(s1);}
。这不算继承吗?可以合理地预期基类的静态构造函数会在其子类的静态构造函数执行之前执行,因为它也可能执行派生类所需的静态初始化。
class Bus<T>
{
    static Bus()
    {
        foreach(FieldInfo fi in typeof(T).GetFields())
        {
            if(fi.FieldType == typeof(Argument))
            {
                fi.SetValue(typeof(T), new Argument("busyname", "busyvalue"));
            }
        }
    }
}
class Buss : Bus<Buss>
{
    public static Argument field;
}