本文介绍了以下编译器错误和警告:
- CS0017: 程序“输出文件名”定义了多个入口点。使用 /main 编译以指定包含入口点的类型。
- CS0028: “函数声明”具有错误的签名作为入口点
- CS0402: “identifier”:入口点不能为泛型或泛型类型
- CS1555: 找不到为 Main 方法指定的“class”
- CS1556: 为 Main 方法指定的“construct”必须是有效的类或结构
- CS1557: 不能对 Main 方法使用“class”,因为它位于不同的输出文件中
- CS1558: “class”没有合适的静态 Main 方法
- CS1559: 无法对 Main 方法使用“object”,因为它已导入
- CS2017: 生成模块或库时无法指定 /main
- CS5001: 程序不包含适用于入口点的静态“Main”方法
- CS7022: 程序的入口点是全局代码;忽略“{0}”入口点。
- CS8801: 不能使用此上下文的顶级语句中声明的局部变量或本地函数“{0}”。
- CS8802: 只有一个编译单元可以有顶级语句。
- CS8803: 顶级语句必须位于命名空间和类型声明之前。
- CS8805: 使用顶级语句的程序必须是可执行文件。
- CS8899: 应用程序入口点不能使用“UnmanagedCallersOnly”特性化。
- CS8937: 至少一个顶级语句必须为非空。
Main 方法声明
- CS0017: 程序“输出文件名”定义了多个入口点。使用 /main 编译以指定包含入口点的类型。
- CS0028: “函数声明”具有错误的签名作为入口点
- CS0402: “identifier”:入口点不能为泛型或泛型类型
- CS1558: “class”没有合适的静态 Main 方法
- CS5001: 程序不包含适用于入口点的静态“Main”方法
- CS8899:应用程序入口点不能应用“UnmanagedCallersOnly”特性。
编译到可执行文件的程序必须包含有效的 Main 方法作为其入口点。 有关详细信息,请参阅 Main()和命令行参数。
若要更正这些错误,请确保 Main 方法声明遵循以下规则:
- 将
Main方法声明为static返回类型void,intTask或者Task<int>,因为运行时需要特定的签名来标识程序的入口点(CS0028,CS1558)。 该方法可以选择性地接受string[]作为命令行参数。 如果使用async修饰符,则返回类型必须为Task或Task<int>,并且必须面向 C# 语言版本 7.1 或更高版本。 - 将
Main方法移出任何泛型类型,因为当包含类型需要类型参数(CS0402)时,运行时无法解析唯一入口点。 -
UnmanagedCallersOnlyAttribute从
Main方法中删除属性,因为入口点必须可从托管代码调用,并将UnmanagedCallersOnly该方法限制为仅非托管调用方(CS8899)。 - 当代码包含不同类型中的多个
Main方法时,请使用 StartupObject 编译器选项指定包含预期入口点的类型(CS0017)。 如果没有该选项,编译器无法确定Main要使用的方法。 - 验证可执行项目是否定义了
Main具有正确签名的方法,因为具有 OutputType of exe 或 winexe 的项目需要入口点(CS5001、 CS1558)。 方法名称区分大小写 -main不符合条件。 如果不需要可执行文件,请将输出类型更改为 库。
注释
CS0028 是当前 C# 编译器不生成的旧诊断。 当现代版本的编译器报告 CS1558 或 CS5001 时,Main方法具有无效签名。
注释
CS0017、CS0028、CS0402、CS1558 和 CS5001 仅在 生成 或 重新生成 操作期间报告。 在 IDE 中键入时,它们不会显示为 IntelliSense 诊断。
StartupObject 编译器选项
- CS1555: 找不到为 Main 方法指定的“class”
- CS1556: 为 Main 方法指定的“construct”必须是有效的类或结构
- CS1557: 不能对 Main 方法使用“class”,因为它位于不同的输出文件中
- CS1559: 无法对 Main 方法使用“object”,因为它已导入
- CS2017: 生成模块或库时无法指定 /main
StartupObject 编译器选项(也称为/main)指定当多个类型定义相同方法时,哪个类型包含程序的Main方法。 有关详细信息,请参阅 StartupObject 和 Main() 和命令行参数。
若要更正这些错误,请确保 StartupObject 选项引用有效类型:
- 验证传递给
StartupObject的完全限定类名称是否与当前编译源代码中定义的类型匹配。 编译器仅搜索正在编译的源文件(而不是引用的程序集)以获取指定的类型(CS1555)。 检查完全限定名称中的拼写错误,包括命名空间。 - 确保传递给
StartupObject的标识符引用的是非泛型的class或struct。 编译器需要可包含有效Main方法(CS1556)的具体类型。 接口、枚举、委托和泛型类型不是有效的目标。 - 将指定的类移动到与当前编译相同的输出文件中。 该
/main选项解析单个输出程序集中的入口点,不能引用编译到其他输出(CS1557)中的类型。 - 确保指定类型在当前项目的源代码中定义,而不是在引用的程序集中定义。 编译器无法将导入的类型指定为入口点(CS1559)。
- 在构建库或模块时,删除
/main选项。 只有可执行项目(具有 exe 或 winexe 的 OutputType)才具有入口点(CS2017)。 如果需要入口点,请将输出类型更改为可执行文件。 - 请确保
StartupObject指定的类型声明了有效的Main方法。 如果类型存在但不包含合适的静态Main方法,编译器将生成 CS1558。 请参阅所需签名的方法声明部分。Main
注释
CS1557 和 CS1559 是当前 C# 编译器不生成的旧诊断。 不再支持触发这些错误的方案,也不经常发生,无法保证检测。
注释
CS1555 和 CS1556 仅在 生成 或 重新生成 操作期间报告。 在 IDE 中键入时,它们不会显示为 IntelliSense 诊断。
顶级语句
- CS7022: 程序的入口点是全局代码;忽略“{0}”入口点。
- CS8801: 不能使用此上下文的顶级语句中声明的局部变量或本地函数“{0}”。
- CS8802: 只有一个编译单元可以有顶级语句。
- CS8803: 顶级语句必须位于命名空间和类型声明之前。
- CS8805: 使用顶级语句的程序必须是可执行文件。
- CS8937: 至少一个顶级语句必须为非空。
顶级语句 将显式 Main 方法替换为程序的入口点。 有关详细信息,请参阅 C# 编程指南中的 顶级语句 和 顶级语句 功能规范。
若要更正这些错误,请确保使用顶级语句遵循以下规则:
- 将所有顶级语句合并到单个文件中,因为只有一个编译单元(文件)可以包含顶级语句(CS8802)。 将其他文件中的任何顶级代码移到该单个文件中。 重新构造其余文件,使其仅包含命名空间和类型声明。
- 将所有顶级语句放在文件中的任何
namespace语句或type声明之前,因为编译器要求先显示顶级语句(CS8803)。 如果有using指令,这些指令仍可位于顶级语句前面。 - 包含至少一个包含可执行代码的语句,因为只有空语句、空格或注释的文件不符合有效的入口点(CS8937)。 添加一个语句(如方法调用、变量赋值或表达式),以满足要求。
- 仅从顶级语句上下文本身内部访问顶级语句中声明的局部变量和本地函数,因为这些声明的范围限定为生成的入口点方法,对其他文件或在同一文件中声明的类型成员不可见(CS8801)。 如果需要跨文件共享状态,请改为将变量声明为类型的静态字段或属性。
- 将项目的 OutputType 设置为 exe,因为顶级语句定义入口点和入口点仅在可执行项目中有效(CS8805)。 如果要生成库,请删除顶级语句,并改用类型和方法。
- 当存在顶级语句时,删除或重命名任何显式
Main方法,因为编译器将顶级语句视为入口点并忽略任何Main方法,从而生成警告(CS7022)。 如果打算使用显式Main方法,请将顶级语句代码移到该方法中,并删除顶级语句。