使用基类中的static void Main()方法作为程序的入口点

时间:2014-11-20 22:40:00

标签: c# console-application entry-point

我想将一些程序逻辑抽象到基类来执行命令行程序(类似于this question was requesting的功能)。

换句话说,就像这样:

public abstract class BaseProgram<T>
{
    public static void Main(string[] args)
    {
        Console.WriteLine(typeof(T));
    }
}

public class Program : BaseProgram<string>
{
}

重要的是要注意BaseProgram在不同的程序集中。

然而,这不起作用。 static void Main(string[] args)方法必须在派生类中。谁能解释为什么会这样?毕竟,以下内容完全是“合法的”:

Program.Main(null);
BaseProgram<string>.Main(null);

并输出:

> System.String
> System.String

我想知道什么:这个结果是否有任何记录原因?

2 个答案:

答案 0 :(得分:4)

我认为问题是BaseClass是通用的。为了调用main,你必须提供一个类型参数,那么系统应该选择哪种类型来调用这个方法?当然,它不能做出随机选择,所以这是非法的。

我在C# 5.0 Language Specification

3.1 Application Startup找到了这个
  

应用程序入口点方法可能不在泛型类声明中。

答案 1 :(得分:3)

正如在评论其他答案时最终披露的那样,您的BaseProgram<T>课程与您尝试执行的课程不同。程序集的入口点必须位于 程序集中。

否则就像给别人一把钥匙并告诉他们这是你房子前门的钥匙。除了钥匙实际上对于其他一些完全不同的房子的前门,所以当他们出现在你的房子时它们没有好处。

如果您想使用BaseProgram<T>的{​​{1}}方法,则需要委托给它。例如,在您自己的程序集中:

Main()

请注意,对于静态类型或类型的静态成员,不需要实际继承基类型,因为您只需通过实际类型名称而不是实例引用来调用它。