全局 using 是 c# 10+ 编译器级语法特性,必须置于 .cs 文件顶部最外层、所有 namespace 之前,仅支持纯命名空间导入,不支持别名或 static;与 implicitusings 共存但不覆盖,需手动管理避免冗余。

全局 using 不是“配置”,而是编译器级语法特性;它必须写在源码中,不能靠项目文件或设置开关启用。
全局 using 必须放在 .cs 文件顶部,且不能嵌套在命名空间内
常见错误是把它塞进某个 namespace 块里,比如:
namespace MyApp
{
global using System;
class Program { }
}
这会直接报错:CS8773: Feature 'global using' is not available in C# 9.0. Please use language version 10.0 or greater. ——但其实语言版本是对的,真正原因是位置非法。
-
global using只能出现在文件最外层(即“编译单元顶层”),和普通using一样,但必须在任何namespace、class、extern alias声明之前 - 推荐统一放在一个专用文件里,例如
GlobalUsings.cs,避免散落在多个文件中导致维护混乱 - 如果项目启用了
ImplicitUsings(如 SDK 风格项目默认开启),global using会和隐式引入的命名空间合并,顺序无关,但显式写的仍优先参与 IDE 智能提示
global using 和 ImplicitUsings 项目属性容易混淆
很多人以为关掉 <implicitusings>enable</implicitusings> 就能“彻底控制所有 using”,其实不是:
-
ImplicitUsings是 SDK 提供的快捷方式,自动注入常用命名空间(如System、System.Collections.Generic等),但它生成的是编译器内部的“隐式全局 using”,你无法在代码里看到或修改它 -
global using是你手写的、可见的、可调试的语句,它和隐式 using 共存,且不会互相覆盖——两者都会生效 - 若想完全禁用隐式引入,得设
<implicitusings>disable</implicitusings>,再手动补全所有需要的global using,否则连Console都会报红
别名 + global using 组合时,using alias = ... 不能加 global
这是个隐蔽坑点。下面这段代码是非法的:
global using Collections = System.Collections.Generic;
编译器会报:CS8774: Global using directive must be a simple namespace import.
-
global using只支持纯命名空间导入,不支持别名、静态导入(using static)、外部别名(extern alias) - 如果需要别名,只能用普通
using alias = ...,并确保它也放在文件顶层(但它不是全局的,只对当前文件有效) - 静态成员导入同理:想全局访问
Math.Max而不写System.Math.Max,必须每个文件单独写using static System.Math;,global using static语法不存在
真正难处理的不是怎么写,而是团队协作时有人忘了删旧的局部 using,结果同一命名空间被重复引入——编译器不报错,但 IDE 可能提示冗余,且影响代码扫描工具判断真实依赖。建议配合 EditorConfig 或 Roslyn 分析器做一致性检查。










