初探 C# 15 的 Union Types
C# 15 引入的联合类型Union Types是一项备受期待的功能旨在以一种类型安全的方式表示一个值可以是多种固定类型中的一种。从 .NET 11 Preview 2 开始该功能已引入编译期支持Preview 3 则进一步完善了 IDE 的开发体验。官方博客的公告文章明确指出union关键字用于声明一个值是一组固定类型中的恰好一种。编译器会强制要求对联合类型的变量进行穷尽性模式匹配Exhaustive Pattern Matching确保所有可能的类型分支都被处理从而大大增强了代码的健壮性。基础语法与核心概念联合类型通过union关键字声明可以直接与现有类型组合语法非常简洁。声明与使用你可以直接列出允许的类型来定义一个联合。当给联合类型的变量赋值时编译器会提供从这些具体类型到联合类型的隐式转换。// 1. 定义一些现有类型 public record class Cat(string Name); public record class Dog(string Name); public record class Bird(string Name); // 2. 用一行代码声明联合类型 public union Pet(Cat, Dog, Bird); // 3. 使用 Pet pet new Dog(Rex); // 隐式转换 // 4. 结合模式匹配进行穷尽性检查 string name pet switch { Dog d d.Name, Cat c c.Name, Bird b b.Name, // 无需 default 分支因为编译器知道已处理所有情况 };编译器生成代码这种简洁的声明实际上是语法糖。编译器会在后台生成一个struct它包含一个object?类型的Value属性以及对应每个 case 的构造函数。// public union Pet(Cat, Dog, Bird); 大致会生成如下代码 [Union] public struct Pet : IUnion { public Pet(Cat value) Value value; public Pet(Dog value) Value value; public Pet(Bird value) Value value; public object? Value { get; } }实际应用场景联合类型能优雅地解决许多传统 C# 代码中难以处理的场景。处理OneOrMoreT场景当一个值可以是一个单独元素也可以是多个元素的集合时联合类型非常有用。你还可以在联合体内定义方法便于使用。public union OneOrMoreT(T, IEnumerableT) { public IEnumerableT AsEnumerable() Value switch { T single [single], IEnumerableT multiple multiple, null [] // 处理 null 情况 }; } // 使用 OneOrMorestring tags dotnet; // 使用单个值 OneOrMorestring moreTags new[] { csharp, unions }; // 使用集合 foreach (var tag in tags.AsEnumerable()) // 统一的遍历方式 { Console.Write($[{tag}]); }实现类型安全的ResultT传统上用包装类或抛出异常来处理错误既不优雅也不安全。联合类型可以完美地表达“要么成功返回值要么失败返回异常”的逻辑。public union ResultT(T, Exception); Resultint Divide(int a, int b) { if (b 0) return new DivideByZeroException(); return a / b; } // 使用时编译器强制你处理成功和失败两种情况 var result Divide(10, 0); string message result switch { int value $结果是 {value}, Exception ex $出错了{ex.Message} };高级特性与未来发展联合类型的设计考虑了灵活性和性能同时也为未来更强大的功能奠定了基础。自定义联合避免装箱默认实现会对值类型进行装箱。如果对性能有极致要求你可以通过手动为类型添加[Union]特性并实现特定的TryGetValue模式来避免装箱。三大穷尽性检查特性联合类型是 C# 迈向更完备的类型系统的一部分。它与计划中的封闭类层次结构closedclass和封闭枚举closedenum共同构成了三大穷尽性检查机制。closedclass 可以限制派生类只能在同一个程序集中定义这与联合类型的“封闭类型集”思想一致。参考文章链接以下是关于 C# 15 联合类型的补充参考文章按推荐优先级整理1. Microsoft 官方博客最权威Explore union types in C# 15来源.NET BlogMicrosoft Developer Blogs作者Bill WagnerC#/.NET Principal Content Developer链接https://devblogs.microsoft.com/dotnet/csharp-15-union-types/这是最核心的官方参考资料包含Union 类型的设计理念和语法介绍OneOrMoreT等实战示例自定义 Union 实现[Union]特性、非装箱访问模式与封闭层次结构Closed hierarchies、封闭枚举Closed enums的路线图关系如何在 .NET 11 Preview 中启用的详细步骤2. 详尽技术解读中文C# 15 类型系统改进Union Types来源图灵课堂链接https://blog.tulingxueyuan.cn/tlzx/jsp/22039.html这篇文章对官方内容进行了非常详尽的补充包含从实际问题出发的设计动机分析ResultT完整实现示例手动实现 Union 模式[Union]特性非装箱访问模式的性能优化方案与 F# Discriminated Unions 的对比说明适合需要深入理解实现细节的开发者。3. Preview 3 版本动态.NET 11 Preview 3 发布C# 15 union 类型终补齐Kestrel 暴增 40%来源博客园链接https://www.cnblogs.com/shenchuanchao/p/19914448/本文补充了Preview 3 的更新信息IDE 体验完善智能感知、重构、导航全链路可用Preview 2 vs Preview 3 的功能演进说明Polyfill 代码要求正式版将内置4. 概念对比与背景分析C# 15 Unions来源NDepend Blog链接https://blog.ndepend.com/csharp-unions/适合想了解设计决策背景的读者C# Union 与 F# Discriminated Union 的差异分析值类型装箱问题的性能讨论与开闭原则OCP的关系Reddit 上 C# 团队成员的补充说明快速参考汇总文章来源核心价值Explore union types in C# 15Microsoft 官方必读权威语法与设计C# 15 类型系统改进Union Types图灵课堂详尽中文解读 实战示例.NET 11 Preview 3 发布博客园Preview 3 IDE 体验更新C# 15 UnionsNDepend Blog设计背景 性能分析