使用基类中的static void Main()方法作为程序的入口点
我想将一些程序逻辑抽象到基类来执行命令行程序(function类似于这个问题所要求的function )。
换句话说,这样的事情:
public abstract class BaseProgram { public static void Main(string[] args) { Console.WriteLine(typeof(T)); } } public class Program : BaseProgram { }
重要的是要注意BaseProgram在不同的程序集中。
但是,这不起作用。 static void Main(string[] args)
方法必须位于派生类中。 谁能解释为什么会这样? 毕竟,以下是完全“合法的”:
Program.Main(null); BaseProgram.Main(null);
并将输出:
> System.String > System.String
我想知道的是 :这个结果是否有任何记录的原因?
正如在对另一个答案的评论期间最终披露的那样,您的BaseProgram
类与您尝试执行的程序集不同。 assembly的入口点必须在该assembly中。
否则就像给某人一把钥匙并告诉他们这是你房子前门的钥匙。 除了钥匙实际上对于其他一些完全不同的房子的前门,所以当他们出现在你的房子时它们没有好处。
如果要使用BaseProgram
的Main()
方法,则需要委托给它。 例如,在您自己的程序集中:
static class Program { public static int Main(string[] args) { return BaseProgram.Main(args); } }
请注意,对于静态类型或类型的静态成员,不需要实际inheritance基类型,因为您只需通过实际类型名称而不是实例引用来调用它。
我认为问题在于BaseClass
是通用的。 为了调用main,你必须提供一个类型参数,那么系统应该选择哪种类型来调用这个方法? 当然,它不能随意选择,所以这是非法的。
我在3.1 Application Startup
C# 5.0 Language Specification
中找到了这个
应用程序入口点方法可能不在generics类声明中。