解决与 using 指令和命名空间声明相关的错误和警告

本文介绍以下编译器错误:

  • CS0101: 错误:命名空间“namespace”已包含“identifier”的定义
  • CS0104:错误:“reference”是“identifier”和“identifier”之间不明确的引用。
  • CS0116: 错误:命名空间不能直接包含字段、方法或语句等成员。
  • CS0138:错误:using 命名空间指令只能应用于命名空间;“type”是一个类型,而不是命名空间。
  • CS0430:错误:未在 /reference 选项中指定外部别名“alias”。
  • CS0431:错误:无法将别名“identifier”与“”一起使用,因为该别名引用了类型。::.请改用 。
  • CS0432:错误:找不到别名“identifier”。
  • CS0434: 错误:NamespaceName2 中的命名空间 NamespaceName1 与 NamespaceName3 中的 TypeName1 类型冲突。
  • CS0438:错误:“module_1”中的类型“type”与“module_2”中的命名空间“namespace”冲突。
  • CS0439:错误:外部别名声明必须位于命名空间中定义的所有其他元素之前。
  • CS0518: 错误:未定义或导入预定义类型“type”。
  • CS0576:错误:命名空间“namespace”包含与别名“identifier”冲突的定义。
  • CS0687:错误:命名空间别名限定符 始终解析为类型或命名空间,因此在这里是非法的。::请考虑改用 .。
  • CS1022: 错误:预期类型定义、命名空间定义或文件结束符。
  • CS1527: 错误:在命名空间中定义的元素不能显式声明为私有、受保护、受保护的内部或私有受保护
  • CS1529:错误:using 子句必须位于命名空间中定义的所有其他元素之前,extern 别名声明除外。
  • CS1537:错误:using 别名“alias”此前已在此命名空间中出现。
  • CS1671: 错误:命名空间声明不能具有修饰符或属性。
  • CS1679:错误:“/reference”的 extern 别名无效;“identifier”不是有效的标识符。
  • CS1680:错误:引用别名选项无效:“alias=” -- 缺少文件名。
  • CS1681: 错误:无法重新定义全局外部别名。
  • CS1730:错误:程序集和模块属性必须位于文件中定义的所有其他元素之前,除非使用子句和外部别名声明。
  • CS2034:错误:声明 extern 别名的 /reference 选项只能有一个文件名。若要指定多个别名或文件名,请使用多个 /reference 选项。
  • CS7000:错误:意外使用了别名。
  • CS7007: 错误:指令 using static 只能应用于类型。请改为考虑指令 using namespace 。
  • CS7015: 错误:“extern alias”在此上下文中无效。
  • CS7016: 错误:别名“alias”与符号类型定义冲突
  • CS7021: 错误:无法在脚本代码中声明命名空间。
  • CS8083:错误:别名限定名不是表达式。
  • CS8085:错误:“using static”指令不能用于声明别名。
  • CS8914:错误:不能在命名空间声明中使用 global using 指令。
  • CS8915:错误:全局 using 指令必须位于所有非全局 using 指令之前。
  • CS8954:错误:源文件只能包含一个文件范围的命名空间声明。
  • CS8955: 错误:源文件不能同时包含文件范围的声明和普通命名空间声明。
  • CS8956: 错误:文件范围的命名空间必须位于文件中的所有其他成员之前。
  • CS9130:错误:using 别名不能是 ref 类型。
  • CS9131:错误:只有 using 别名可以是 unsafe。
  • CS9132:错误:using 别名不能是可为 null 的引用类型。
  • CS9133:错误: 修饰符必须位于 static 修饰符之前。unsafe
  • CS9162:类型对“using static”无效。只能使用类、结构、接口、枚举、委托或命名空间。
  • CS9348: 编译单元不能直接包含字段、方法或属性等成员

以下是编译器警告:

  • CS0105:警告:“namespace”的 using 指令以前在此命名空间中出现过。
  • CS0435:警告:“assembly”中的命名空间“namespace”与“assembly”中导入的类型“type”发生冲突。使用在“assembly”中定义的命名空间。
  • CS0436:警告:“assembly”中的类型“type”与从“assembly”导入的类型“type2”冲突。使用“assembly”中定义的类型。
  • CS0437:警告:“assembly2”中的类型“type”与“assembly1”中导入的命名空间“namespace”冲突。使用在“assembly”中定义的类型。
  • CS0440:警告:由于 总是引用全局命名空间而非别名,因此定义一个名为 global 的别名是欠妥的。global::
  • CS8019:信息:不必要的 using 指令。
  • CS8020:信息:未使用的 extern 别名。
  • CS8933:信息:该 using 指令此前已作为全局 using 出现。

这些错误和警告表明,using 指令、编译单元和命名空间中的声明,或类型与命名空间之间的命名冲突存在问题。 以下部分介绍了这些错误以及如何更正这些错误。

Using 指令

以下错误与 using 指令相关:

  • CS0105: “namespace”的 using 指令在之前已经出现在此命名空间中。
  • CS0430: 未在 /reference 选项中指定外部别名“alias”。
  • CS0439: 外部别名声明必须在命名空间中定义的所有其他元素之前。
  • CS1529:using 子句必须位于命名空间中定义的所有其他元素之前,extern 别名声明除外。
  • CS1679: “/reference”的 extern 别名无效;“identifier”不是有效的标识符。
  • CS1680: 引用别名选项无效:“alias=” -- 缺少文件名。
  • CS1681: 无法重新定义全局外部别名。
  • CS1730: 程序集和模块属性必须位于文件中定义的所有其他元素之前,除非使用子句和外部别名声明。
  • CS2034: 声明外部别名的 /reference 选项只能有一个文件名。若要指定多个别名或文件名,请使用多个 /reference 选项。
  • CS7015: “extern alias”在此上下文中无效。
  • CS8019: 不必要的 using 指令。
  • CS8020: 未使用的 extern 别名。
  • CS8933:该 using 指令此前已作为全局 using 出现。

有关这些诊断所依据的规则,请参阅 using 指令 和 extern 别名 语言参考。 潜在的修补程序包括:

  • 将所有 using 指令移到文件顶部或命名空间声明的顶部。 C# 语言要求 using 指令位于命名空间中的其他元素(CS1529)之前。
  • 将所有 extern alias 声明移动到任何 using 指令之前。 语言要求在所有其他元素(包括 using 指令(CS0439、 CS7015)之前提供外部别名。
  • 将所有程序集和模块级别的属性移到 `using` 子句和 `extern alias` 声明之后,但在任何类型声明之前。 属性必须遵循指令,但在类型之前(CS1730)。
  • 确保 extern alias 源代码中的每个声明都有在项目的 引用选项中定义的相应别名。 编译器无法解析未指定的别名(CS0430)。
  • 为每个外部别名使用单独的 /reference 选项,而不是在单个选项中合并多个别名。 编译器需要每个引用选项一个别名(CS2034)。
  • 确保选项中的 /reference 别名是有效的 C# 标识符。 别名必须遵循标识符命名规则(CS1679)。 在别名引用选项的 = 符号后包含文件名。 编译器需要知道别名引用的程序集(CS1680)。
  • 请勿尝试重新定义 global 外部别名。 global 是一个预定义别名,引用所有未加别名的引用(CS1681)。
  • 删除重复 using 指令。 编译器在多次导入同一命名空间时发出警告(CS0105、 CS8019、 CS8933)。
  • 删除未使用的 extern alias 声明。 当 extern 别名已声明但从未在代码中引用时,编译器会发出诊断(CS8020)。

Using static 指令

以下错误与 using static 指令相关:

  • CS0138: 使用命名空间指令只能应用于命名空间;“type”不是命名空间的类型。
  • CS7007: 指令 using static 只能应用于类型。请改为考虑指令 using namespace 。
  • CS9133:static 修饰符必须位于 unsafe 修饰符之前。
  • CS9162: 类型对“使用静态”无效。只能使用类、结构、接口、枚举、委托或命名空间。

有关控制这些诊断的规则,请参阅 使用静态指令 语言参考。 潜在的修补程序包括:

  • static直接导入类型成员时添加修饰符,因为省略static会告知编译器要导入命名空间而不是类型(CS0138)。
  • static导入命名空间时删除修饰符,因为using static只能应用于类型,而不是命名空间(CS7007)。 确保指令的目标 using static 是类、结构、接口、枚举或委托,因为其他类型的不是静态导入的有效目标(CS9162)。
  • 组合这两者时,应将static修饰符置于unsafe修饰符之前,因为语言要求修饰符有特定的顺序(CS9133)。

全局 using 指令

以下错误与 global using 指令相关:

  • CS8914: 命名空间声明中不能使用全局 using 指令。
  • CS8915: 全局 using 指令必须位于所有非全局 using 指令之前。

有关这些诊断所依据的规则,请参阅 全局 using 指令 语言参考。 潜在的修补程序包括:

  • 将位于任何命名空间声明之外的 global using 指令移动到文件范围,因为全局 using 适用于整个项目,无法限制在某个命名空间中(CS8914)。
  • 将所有 global using 指令放在文件中的任何非全局 using 指令之前,因为语言要求全局指令位于本地指令之前(CS8915)。
  • 指令 static global using 不能引用 文件本地 类型。

文件范围命名空间

以下错误与文件范围的命名空间相关:

  • CS8954: 源文件只能包含一个文件范围的命名空间声明。
  • CS8955: 源文件不能同时包含文件范围和普通命名空间声明。
  • CS8956: 文件范围的命名空间必须位于文件中的所有其他成员之前。

有关控制这些诊断的规则,请参阅 文件范围的命名空间 语言参考。 潜在的修补程序包括:

  • 每个文件只使用一个文件范围的命名空间声明,因为该语言只允许单个文件范围的命名空间为文件中的所有类型设置命名空间(CS8954)。
  • 选择单个文件中的文件范围或块范围的命名空间声明,因为该语言不允许混合这两种样式(CS8955)。
  • 在任何类型声明之前移动文件范围的命名空间声明,因为在声明类型之前必须建立命名空间(CS8956)。

别名限定符

以下错误与别名限定符相关:

  • CS0431: .
  • CS0432: 找不到别名“identifier”。
  • CS0440: 定义命名的 global 别名是不明智的,因为 global:: 始终引用全局命名空间而不是别名。
  • CS0687: 命名空间别名限定符 :: 始终解析为类型或命名空间,因此此处是非法的。请考虑改用 . 。
  • CS7000: 意外使用别名。
  • CS8083: 别名限定的名称不是表达式。

有关控制这些诊断的规则,请参阅 命名空间别名限定符 语言参考。 潜在的修补程序包括:

  • 当你访问类型别名的成员时,请将::运算符替换为.运算符,因为::限定符仅适用于命名空间别名,而不是类型别名(CS0431,CS0687)。
  • 确保引用的别名是使用 using 指令声明的,或者 extern alias,因为编译器无法解析未定义的别名(CS0432)。
  • 仅在需要类型或命名空间名称的上下文中使用别名限定符,因为别名限定名称不作为表达式有效(CS7000,CS8083)。
  • 为别名选择其他名称,而不是 global,因为 global 保留以引用全局命名空间,因此无法重新定义(CS0440)。

使用别名限制

以下错误与使用别名的限制有关:

  • CS0576: 命名空间“namespace”包含与别名“identifier”冲突的定义。
  • CS1537: 使用别名 “alias” 以前已在此命名空间中出现。
  • CS7016: 别名“alias”与符号类型定义冲突
  • CS8085: “using static”指令不能用于声明别名。
  • CS9130:using 别名不能是 ref 类型。
  • CS9131:只有 using 别名可以是 unsafe。
  • CS9132: 不能将别名用作可空引用类型。

请参阅 使用别名 语言参考以了解管理这些诊断的规则。 潜在的修补程序包括:

  • 您需要为别名选择一个唯一的名称,以避免与作用域中的现有类型或命名空间名称产生冲突,因为编译器无法区分别名与现有定义(CS0576)。
  • 在命名空间中只使用一次别名,因为重复的别名声明会创建歧义(CS1537)。
  • 在脚本或提交代码中,重命名使用别名或冲突提交成员,使其名称是唯一的(CS7016)。 诊断标识成员类型,例如 field 或 type。
  • static声明别名时删除修饰符,因为别名和静态导入是互斥的 - 用于using static导入成员或using Alias =创建别名,但不能同时创建别名(CS8085)。

从 C# 12 开始,以下限制适用于使用别名:

  • 请勿在别名中使用ref或inout修饰符,因为这些参数修饰符在类型别名上下文中无效(CS9130)。
  • 仅对引用指针类型的别名或 using static 指令使用 unsafe 修饰符,因为不允许没有别名或静态导入的 unsafe(CS9131)。
  • 在创建引用类型的别名时使用不可为 null 的引用类型,因为无法直接将可为 null 的引用类型(CS9132)别名化。

编译单元和命名空间声明

以下错误与编译单元和命名空间中的声明相关:

  • CS0116: 命名空间不能直接包含字段、方法或语句等成员。
  • CS1022: 期望类型或命名空间定义,或文件末尾。
  • CS1527: 命名空间中定义的元素不能显式声明为专用、受保护、受保护的内部或专用保护。
  • CS1671: 命名空间声明不能具有修饰符或属性。
  • CS7021: 无法在脚本代码中声明命名空间。
  • CS9348: 编译单元不能直接包含字段、方法或属性等成员。

有关控制这些诊断的规则,请参阅 命名空间关键字和 C# 程序常规结构的语言参考。 潜在的修补程序包括:

  • 确保所有方法、字段和属性都在类型(类、结构、记录或接口)内声明,而不是直接在命名空间内,因为命名空间只能包含类型声明、嵌套命名空间和 using 指令(CS0116)。
  • 将字段、属性、事件、索引器、运算符和成员方法移动到类、结构、记录或接口(CS9348)。 在编译单元范围内,可执行代码可以是全局命名空间中的顶级语句,而方法形状声明是本地函数,而不是成员方法。
  • 检查源文件中的大括号是否匹配,因为命名空间或类型定义后的多余的右大括号会在编译器在文件末尾遇到意外内容时产生错误(CS1022)。
  • 将命名空间级类型的可访问性更改为 public 或 internal,或者省略访问修饰符,以使用默认的 internal 可访问性(CS1527)。 在没有显式命名空间的情况下声明的类型是全局命名空间的成员,因此应用相同的限制。
  • 从命名空间声明中删除任何访问修饰符或属性,因为命名空间不支持修饰publicprivate符,或者,属性不能应用于它们(CS1671)。
  • 将命名空间声明移出 C# 脚本文件(.csx)和常规源文件(.cs),因为脚本代码在不支持命名空间声明(CS7021)的单个执行上下文中求值。

命名空间和类型命名冲突

以下错误和警告与命名空间和类型之间的命名冲突相关:

  • CS0101: 命名空间“namespace”已包含“identifier”的定义
  • CS0104:“reference”是“identifier”和“identifier”之间不明确的引用。
  • CS0434: NamespaceName2 中的命名空间 NamespaceName1 与 NamespaceName3 中的 TypeName1 类型冲突。
  • CS0435:“assembly”中的命名空间“namespace”与从“assembly”导入的类型“type”冲突。使用“assembly”中定义的命名空间。
  • CS0436:“assembly”中的类型“type”与从“assembly”导入的类型“type2”冲突。使用“assembly”中定义的类型。
  • CS0437: “assembly2”中的类型“type”与“assembly1”中导入的命名空间“namespace”冲突。使用在“assembly”中定义的类型。
  • CS0438: “module_1”中的类型“type”与“module_2”中的命名空间“namespace”冲突。

有关这些诊断所依据的规则,请参阅 using 指令、extern 别名 和 命名空间别名限定符 语言参考。 潜在的修补程序包括:

  • 当代码引用多个导入的命名空间中存在的名称时,请使用完全限定的名称或 命名空间别名 。
  • 编译器无法确定当相同名称出现在由using两个或多个命名空间中时要使用的类型(CS0104)。
  • 重命名或删除重复的命名空间成员(CS0101)。 命名空间和类型也不能具有相同的完全限定名称,因此,当类型名称与嵌套命名空间名称冲突时,请重命名任一声明。
  • 当导入的类型和导入的嵌套命名空间共享相同的完全限定名称时,请重命名类型或命名空间。 当引用名称时,编译器无法区分它们(CS0434、 CS0438)。

若要解决命名冲突警告,请重命名其中一个冲突声明、使用不同的命名空间、删除不必要的程序集引用,或使用 外部别名 消除两个定义之间的歧义。 编译器会自动解决这些冲突 - 使用本地定义的命名空间而不是导入的类型(CS0435)、使用本地定义的类型而不是导入的类型(CS0436)、或者使用本地定义的类型而不是导入的命名空间(CS0437) - 但这些警告表明您应解决潜在的混淆来源。

预定义类型导入

以下错误与缺少预定义类型定义相关:

  • CS0518: 未定义或导入预定义类型“type”。

注释

仅在显式构建或重新构建操作期间报告此警告。 在 IDE 中键入时,它不会作为 IntelliSense 诊断的一部分出现。 这意味着,如果通过使用字段或移除字段来修复警告,那么在重新生成或再次生成项目之前,警告可能仍会保留在错误列表中。

有关控制此诊断的规则,请参阅 NoStandardLib 编译器选项 语言参考。

验证项目是否面向正确的 .NET 运行时。 System.Int32 和 System.String 等预定义类型来自运行时库。 错误或缺失 <TargetFramework> 的规范可防止编译器查找这些类型(CS0518)。 请确保<TargetFramework>文件中的.csproj属性指定了预期的运行时(例如net10.0)。 除非打算定义自己的命名空间,否则不要指定 编译器选项。 此选项可防止导入定义所有预定义类型的标准库(CS0518)。 如果错误仍然存在,请尝试在 Visual Studio 中重新加载项目、删除 obj 和 bin 文件夹并重新生成项目,或重新安装 .NET 运行时(CS0518)。