我想将一些程序逻辑抽象到基类来执行命令行程序(类似于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
我想知道什么:这个结果是否有任何记录原因?
答案 0 :(得分:4)
我认为问题是BaseClass
是通用的。为了调用main,你必须提供一个类型参数,那么系统应该选择哪种类型来调用这个方法?当然,它不能做出随机选择,所以这是非法的。
我在C# 5.0 Language Specification
3.1 Application Startup
找到了这个
应用程序入口点方法可能不在泛型类声明中。
答案 1 :(得分:3)
正如在评论其他答案时最终披露的那样,您的BaseProgram<T>
课程与您尝试执行的课程不同。程序集的入口点必须位于 程序集中。
否则就像给别人一把钥匙并告诉他们这是你房子前门的钥匙。除了钥匙实际上对于其他一些完全不同的房子的前门,所以当他们出现在你的房子时它们没有好处。
如果您想使用BaseProgram<T>
的{{1}}方法,则需要委托给它。例如,在您自己的程序集中:
Main()
请注意,对于静态类型或类型的静态成员,不需要实际继承基类型,因为您只需通过实际类型名称而不是实例引用来调用它。