C# 10 中文件范围命名空间写作 namespace X;,后跟类型定义,不可混用块式声明,须置于文件顶部且仅一个,不支持嵌套,与传统块式语义等价但语法更扁平。
在 C# 10 中,namespace 可以直接跟一个分号结束,不用大括号包裹类型声明,这就是“文件范围命名空间”。它让整个 .cs 文件里的所有类型(类、记录、接口等)自动归属到该命名空间下。
常见错误是混用:比如写了文件范围 namespace X;,又在下面手动加了 namespace X { ... } 块——这会触发编译错误 CS8807(“无法在同一文件中混合使用文件范围和常规命名空间声明”)。
namespace 声明class、record、struct 等)必须紧跟其后,中间不能有空行或 using 指令(using 可以放在它前面,但不能穿插在 namespace 和类型之间)namespace A.B; 后再写 namespace A.C; —— 第二个会报错传统写法需要把所有类型包进大括号里,缩进深、视觉噪音大;文件范围写法则扁平化,更接近 Go 或 Rust 的模块组织直觉。但要注意:它们语义完全等价,编译后生成的元数据没区别,只是语法糖。
性能无影

Program 在 A,而 Helper 在 A.Utils)可以,而且推荐。C# 10 引入的 global using 通常放在 Directory.Build.props 或单独的 Usings.cs 文件里,它与文件范围 namespace 完全正交。
典型组合是:global using System; + global using static System.Console; 放在头文件,然后业务文件用 namespace MyApp.Services; 开头,清爽无冗余。
global using 必须在任何 namespace 声明之前(包括文件范围的)System.Text.Json),仍可在文件范围 namespace 上方加普通 using
global using static 引入过多扩展方法,可能污染 IntelliSense最常见原因是项目未真正启用 C# 10。即使装了 .NET 6 SDK,若 .csproj 中没显式指定语言版本,MSBuild 默认按目标框架推断(例如面向 net6.0 时默认 C# 10,但某些旧模板或 CI 配置可能锁死在 C# 9)。
检查并修正 .csproj:
10.0
net6.0 ,理论上无需额外设置,但 CI 环境可能缓存旧 SDK 版本dotnet --list-sdks 确认安装的是 6.0.x 或更高版本 SDK文件范围命名空间看着简单,但实际落地时,最容易被忽略的是构建环境一致性 —— 本地能编译,CI 失败,八成是 LangVersion 或 SDK 版本没对齐。