如何实现支持引用类型与值类型的可空返回泛型方法?
解决方案
可以通过合并为单个泛型方法,结合notnull约束与T?可空返回类型来实现,无需拆分方法名。代码如下:
T? Foo<T>(T obj) where T : notnull { return Random.Shared.Next() < 100 ? default(T?) : obj; }
原理说明
notnull约束确保T是不可空的值类型或引用类型,覆盖你需要的两种场景。- 对于值类型,
T?等价于Nullable<T>,default(T?)会返回该可空值类型的“空”状态(即HasValue = false);对于引用类型,T?表示可空引用类型,default(T?)直接返回null。 - 这种写法避免了因泛型约束不同导致的重载冲突,因为编译器不再将两个约束不同的方法视为重复定义。
替代方案(C# 8.0之前)
如果使用的是C# 8.0之前不支持可空引用类型的版本,可以通过返回object?并配合类型转换实现,但会丢失编译时类型安全性:
object? Foo<T>(T obj) { return Random.Shared.Next() < 100 ? null : obj; }
内容的提问来源于stack exchange,提问作者codymanix
相关产品推荐
相关产品推荐

