You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个C#函数返回任意T类型的可空值?

如何用单个C#函数处理值类型和引用类型的可空逻辑

一、单个函数返回任意类型的"空值"

可以直接利用C#的可空泛型语法,无需分开处理值类型和引用类型:

private static T? GetNull<T>()
{
    return default;
}
  • 对于引用类型(如string),T?表示可空引用类型,default(T?)等价于null;
  • 对于值类型(如int),T?等价于Nullable<T>,default(T?)会返回处于null状态的可空值类型实例,和直接返回null效果一致。

二、合并可空加载器函数

同理,我们可以将两个类型专属的加载器函数合并为一个通用函数:

private static Func<string, T?> NullableLoader<T>(Func<string, T> innerLoader)
{
    return text => string.IsNullOrWhiteSpace(text) ? default(T?) : innerLoader(text);
}

修改后的单元测试可以统一调用这个函数,无需区分值类型或引用类型:

[Fact]
public void Test1()
{
    Assert.Equal(123, IntLoader("123"));
    Assert.Equal("xyz", StringLoader(" xyz "));

    Assert.Null(NullableLoader(IntLoader)(""));
    Assert.Null(NullableLoader(StringLoader)(""));
}

原理说明

这个写法的核心是利用C# 8及以后引入的可空引用类型和可空值类型的统一语法:

  • 当T是值类型时,T?自动映射为Nullable<T>;
  • 当T是引用类型时,T?表示该引用可以为null;
  • default(T?)会根据T的类型自动生成对应的"空值":值类型返回可空实例的null状态,引用类型返回null。

此写法在C# 10中完全支持,升级到C# 11后也无需修改。

内容的提问来源于stack exchange,提问作者THX-1138

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:30:37