• 说说.Net 7的带参和不带参的Main入口
  • 发布于 2个月前
  • 447 热度
    0 评论
  • Fayer
  • 0 粉丝 39 篇博客
  •   
前言:
来看看不同托管Main情况。
概述
一般的VS生成的默认Main如下:
static void Main(string[] args)
{
   Console.Write("Tian xia feng yun chu wo bei");
   Console.ReadLine();
}
可以看到Main函数带了参数string[] args。其实它这个参数是可以去掉的,写成如下也可以
static void Main()
{
   Console.Write("Tian xia feng yun chu wo bei");
   Console.ReadLine();
}
为什么不要参数也是可以的呢?本质是在CLR为托管入口提供了两套类型
enum CorEntryPointType
{
    EntryManagedMain // void main(String[])
    EntryCrtMain     // unsigned main(void)
};
EntryManagedMain是默认的,EntryCrtMain则是隐藏的一种托管入口类型。CLR会判断当前的托管Main是否包含了参数,如果有且参数个数为1,则是默认的那种,如果无,则是第二种。所以导致了Main入口函数的参数可有可无。
代码如下:
if (nParamCount == 0)
    *pType = EntryCrtMain;
else {
        *pType = EntryManagedMain;
        if (nParamCount != 1)
            ThrowMainMethodException(pFD, IDS_EE_TO_MANY_ARGUMENTS_IN_MAIN);
如果参数个数不等于1的话,抛出ThrowMainMethodException异常。可以在VS里面搞两个参数试验下。
结果报错如下:
严重性代码说明项目文件行禁止显示状态
错误CS5001程序不包含适合于入口点的静态 "Main" 方法CSC 1活动
用户评论