解决与使用命名空间相关的警告
本文介绍以下编译器错误:
- 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
{
}
编译器会针对 using
或 global using
指令中的重复 using
指令生成警告 CS8933、CS0105 或诊断 CS8019。 可以移除任何重复项。
本文稍后会介绍将 using
指令与 using
指令上的 static
、global
或 unsafe
修饰符错误地结合使用的情况。
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 别名中使用
in
、ref
或out
修饰符:// 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