C# 对泛型类调用静态方法

C# 对泛型类调用静态方法,c#,generics,C#,Generics,我有一个带有静态方法的通用类程序,如下所示: class Program { public static void Main() { Console.WriteLine("HI from program"); Console.ReadLine(); } } class Program1<T> : Program where T : Program { public static void check() {

我有一个带有静态方法的通用类程序,如下所示:

class Program
{
    public static void Main()
    {
        Console.WriteLine("HI from program");
        Console.ReadLine();
    }
}
class Program1<T> : Program where T : Program
{
    public static void check()
    {
        T.Main();                
    }
}
当我尝试访问泛型类Program1中的静态Main方法时,如下所示:

class Program
{
    public static void Main()
    {
        Console.WriteLine("HI from program");
        Console.ReadLine();
    }
}
class Program1<T> : Program where T : Program
{
    public static void check()
    {
        T.Main();                
    }
}
一切正常。
你能解释一下我可能犯的错误吗?

当泛型类型的条件是“Program”本身的类型时,我想你可能不希望“Program1”扩展“Program”。

当你执行
Program1:Program
时,你告诉所有Program1实例不仅是Program1类型,而且是Program类型,因为它继承了它

但是当您执行
Program1
时,您告诉Program1除了它自己的类型之外,还可以有任何独立的类型参数,以便使用该独立类型执行操作

如果使用
Program1:Program
,静态方法可以执行以下操作:

class Program1 : Program
{
    public static void check()
    {
        Program.Main() // but the real good thing to do is just avoid this check method.
        // and use just Program1.Main() in other places
    }
}

在使用
Program1
的情况下,我看不到任何解释该用法的东西,除非您试图做一些我们在问题中没有读到的进一步的事情。在这里,T不是真正的程序,即使您设置了约束。T仅仅是泛型类型。使用它的原因是允许您的类使用不同的类型。如果您只使用一种类型,没有理由使用泛型类型,只需使用
Program

在这种情况下,您可以调用Main(),不需要前缀。我知道很容易将
static
理解为“属于类而不是实例”,在这种情况下,类似这样的方法应该可以工作;但是对于C#的
静态
更好的理解方式是“在编译时可解析”,这很明显说明了为什么不能解析。@AakashM:我不明白为什么调用在编译时在技术上不可解析,所以现在还不清楚为什么这个定义更好。@jon因为C#没有“虚拟静态”,
T
可能没有
Main
;编译器是否应该检查<代码>程序> /代码>的每个继承人以绑定调用?@ AAKASM:不,但是它可以使用“代码> T>代码>的特定类型的知识,用于特定的实例化<代码>程序1>代码>,以直接绑定到该类,即ALA+C++模板。我知道泛型不是这样工作的(例如,不可能在我可以在我的应用程序中引用的程序集中提供这样做的泛型类型),所以这在实践中是不可行的,但至少不清楚为什么这是不可解决的。使其不可解析的原因是
Program1
是独立于其最终类型参数
T
编译的。