在泛型类上调用静态方法

4

我有一个通用类Program,其中静态方法如下:

class Program
{
    public static void Main()
    {
        Console.WriteLine("HI from program");
        Console.ReadLine();
    }
}

当我尝试访问以下泛型类Program1中的静态Main方法:

class Program1<T> : Program where T : Program
{
    public static void check()
    {
        T.Main();                
    }
}

我遇到了这个错误:

“T”是一个“类型参数”,在给定的上下文中无效。

然而,如果我使用
public static void check()
{
    Program.Main();                
}

一切运行良好。您能解释一下我可能犯的错误吗?


在这种情况下,您可以无需前缀调用Main()函数。 - stuartd
我知道把 static 理解为“属于类而不是实例”的想法很诱人,这样做可能会起作用;但更好的理解 C# 中的 static 的方式是“在编译时可解析”,这就很明显为什么这样做不行。 - AakashM
@AakashM:我不明白为什么这个调用在编译时不能被技术上解决,因此目前还不清楚为什么那个定义更好。 - Jon
@jon 因为 C# 没有 'virtual static',所以 T 可能是没有 Main 的东西;编译器是否应该检查每个继承者的 Program 以绑定调用? - AakashM
@AakashM:不,但它可以利用特定实例化的“Program1”的确切类型T的知识直接绑定到该类,就像C++模板一样。我知道泛型不是这样工作的(例如,在我可以在我的应用程序中引用的程序集中提供这样的通用类型是不可能的),因此在实践中无法做到这一点,但至少这不是明显为什么不能解决。使其不可解决的原因是Program1<T>与其最终类型参数T独立编译。 - Jon
@Jon,明白了。现在我的评论编辑窗口已经关闭了... - AakashM
2个回答

3
当你使用Program1 : Program时,你告诉所有的Program1实例不仅是Program1类型,还继承了Program类型。
但是当你使用Program1<T>时,你告诉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并不是真正的程序,即使你像你所做的那样设置限制。 T只是一个普通的泛型类型。使用它的原因是使您的类能够与不同类型一起工作。 如果您只使用一种类型,则没有使用泛型类型的理由,只需使用Program即可。

2
我认为您可能不希望“Program1”扩展“Program”,因为泛型类型的条件是它本身是“Program”类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接