C# 中可空类型与可空引用类型的陷阱
2025-08-29
C# 中 `T?` 语法同时用于表示值类型和引用类型的可空类型,造成了混淆。对于值类型,`T?` 是 `Nullable` 的语法糖,两者是不同类型;而对于引用类型,`T?` 只是表达意图,编译后 `T?` 和 `T` 是同一类型。这种差异导致在编写泛型方法时,例如模拟 F# 的 `List.choose` 功能,会出现编译错误。文章通过一个 `SelectNotNull` 方法的例子,展示了如何通过重载方法并添加类型约束 `where TR : class` 和 `where TR : struct` 来解决这个问题,避免编译器在值类型和引用类型之间产生歧义。尽管问题得以解决,但这种设计依然显得不够优雅。
阅读更多
开发
可空类型