添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • CS0138 :错误:using 命名空间指令只能应用于命名空间;“type”是一个类型,而不是命名空间。
  • CS0431 :错误:无法将别名“identifier”与“ :: ”一起使用,因为该别名引用了类型。 请改用 .
  • CS0432 :错误:未找到别名“identifier”。
  • CS0576 :错误:命名空间“namespace”包含与别名“identifier”冲突的定义。
  • CS0687 :错误:命名空间别名限定符 :: 始终解析为类型或命名空间,因此在这里是非法的。 请考虑改用 .
  • CS1529 :错误:using 子句必须位于命名空间中定义的所有其他元素之前(外部别名声明除外)。
  • CS1537 :错误:using 别名“alias”以前在此命名空间中出现过。
  • CS7000 :错误:意外使用了别名。
  • CS7007 :错误: using static 指令只能应用于类型。 请考虑改用 using namespace 指令
  • CS8083 :错误:别名限定名称不是表达式。
  • CS8085 :错误:“using static”指令不能用于声明别名。
  • CS8914 :错误:不能在命名空间声明中使用 global using 指令。
  • CS8915 :错误:global using 指令必须位于所有非 global using 指令之前。
  • CS9055 :错误:不能在“global using static”指令中使用文件本地类型。
  • CS9130 :错误:using 别名不能是 ref 类型。
  • CS9131 :错误:只有一个 using 别名可以是 unsafe
  • CS9132 :错误:using 别名不能是可为 null 的引用类型。
  • CS9133 :错误: static 修饰符必须位于 unsafe 修饰符之前。
  • CS9162 :类型对“using static”无效。 只能使用类、结构、接口、枚举、委托或命名空间。
  • 并介绍以下编译器警告:

  • CS0105 :警告:“namespace”的 using 指令以前在此命名空间中出现过。
  • CS0440 :警告:由于 global:: 总是引用全局命名空间而非别名,因此定义一个名为 global 的别名是欠妥的。
  • CS8019 :信息:不必要的 using 指令。
  • CS8933 :信息:using 指令在以前显示为 global using。
  • 这些错误和警告指示 using 指令的格式不正确。 以下部分介绍这些错误及其更正方法。

    Using 指令

    指令 using 必须位于 namespace 声明中的任何其他元素之前,或位于文件中的任何 namespace 声明之前。 将 using 指令放在文件后面会导致编译器生成错误 CS1529:

    namespace UsingDirective;
    public class MyClass
    using System.Text.Json; // CS1529
    

    若要解决此问题,请将任何 using 声明移动到文件顶部或命名空间顶部:

    using System.Text.Json;
    namespace UsingDirective;
    public class MyClass
    

    编译器会针对 usingglobal using 指令中的重复 using 指令生成警告 CS8933、CS0105 或诊断 CS8019。 可以移除任何重复项。

    本文稍后会介绍将 using 指令与 using 指令上的 staticglobalunsafe 修饰符错误地结合使用的情况。

    Using static 指令

    using static 指令将一种类型的成员导入到当前命名空间中。 以下示例将 System.Console 中的方法(例如 WriteLine)导入到当前命名空间中:

    using static System.Console;
    

    如果省略 static 修饰符,编译器会生成 CS0138:

    using System.Console; // CS0138
    

    如果包含的是用于导入命名空间而不是类型的 static 修饰符,编译器会生成 CS7007:

    using static System; // CS7007
    

    如果符号不是正确的类型之一,编译器将发出 CS9162。

    如果将 static 修饰符与 using 指令中的 unsafe 修饰符结合使用,static 修饰符必须放在首位:

    using static unsafe UnsafeExamples.UnsafeType;
    

    全局 using 指令

    global using 指令导入当前项目中所有源文件中的命名空间或类型:

    global using System.Text;
    

    任何 global using 指令都必须在该源文件中的任何非全局 using 指令之前,并且不得放置在 namespace 中。 这样做会分别导致生成 CS8915 和 CS8914。

    此外,static global using 指令不能引用文件本地类型。

    别名限定符

    别名限定符 :: 位于命名空间别名之前,或位于 global 别名之后。 如果在 . 应该用于分隔完全限定名称的元素的情况下使用 ::,编译器会发出 CS0431、CS0432、CS0687、*CS7000 或 CS8083 之一。

    在所有情况下,请将 :: 替换为 . 分隔符。

    此外,如果定义名为 global 的别名,编译器会发出 CS0440。 global 别名始终引用全局命名空间。 为它声明别名不起作用,应选择其他名称作为别名。

    可以使用 using 指令声明命名空间或类型的别名

    using JSON = System.Text.Json;
    using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
    using TimedData = (System.DateTime timeRecorded, decimal value);
    

    应尝试为别名创建唯一名称,即前面示例中 = 符号左侧的名称。 使用已映射到某个类型(例如 Object)或命名空间 (System) 的名称会导致 CS0576 或 CS1537。

    有关 using 别名的限制

    在 C# 12 之前,该语言对创建类型声明的别名的 using 指令施加了以下限制:

  • 不能使用 using static 指令创建别名:

    using static con = System.Console;
    using static unsafe ip = int*;
    

    从 C# 12 开始,引入了以下限制:

  • 不能在 using 别名中使用 inrefout 修饰符:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • unsafe using 指令必须指定别名或 static using

    // Elsewhere:
    public namespace UnsafeExamples
        public unsafe static class UnsafeType
            // ...
    // Using directives:
    using unsafe IntPointer = int*;
    using static unsafe UnsafeExamples.UnsafeType;
    using unsafe UnsafeExamples; // not allowed
    
  • 不能为可为 null 的引用类型创建别名:

    using NullableInt = System.Int32?; // Allowed
    using NullableString = System.String?; // Not allowed
    
  •