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

如何在.NET 4.x/.NET Standard 2.0中为带out参数的TryGet类方法实现可空引用安全Polyfill

解决方案

完全可以通过手动Polyfill的方式实现和高版本.NET一致的可空引用类型校验能力。C#的可空静态校验只识别特性的命名空间和类名,不要求特性必须是框架内置提供的,你只需要在项目中自行定义对应特性即可。

实现步骤

  1. 在你的项目中新增一个代码文件,填入如下特性定义:
// 命名空间必须与官方定义完全一致,编译器才会自动识别
namespace System.Diagnostics.CodeAnalysis
{
    /// <summary>指定方法返回特定值时,对应的参数不为null</summary>
    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    internal sealed class NotNullWhenAttribute : Attribute
    {
        public bool ReturnValue { get; }

        public NotNullWhenAttribute(bool returnValue)
        {
            ReturnValue = returnValue;
        }
    }

    /// <summary>指定方法返回特定值时,对应的参数可能为null</summary>
    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    internal sealed class MaybeNullWhenAttribute : Attribute
    {
        public bool ReturnValue { get; }

        public MaybeNullWhenAttribute(bool returnValue)
        {
            ReturnValue = returnValue;
        }
    }

    // 其他需要的可空分析特性(如NotNullIfNotNullAttribute、DoesNotReturnIfAttribute等)都可以按照同样规则自行补充
}
  1. 定义完成后就可以直接在你的TryXXX类方法上使用这些特性,可空校验效果和.NET 5+/.NET Standard 2.1完全一致,你问题中给出的示例代码可以直接正常运行,编译器会正确识别返回值和out参数可空性的关联规则。

注意事项

  • 所有自定义的可空分析特性的访问修饰符必须设置为internal,避免你的库对外公开该类型后,和其他同样做了类似Polyfill的第三方库产生类型冲突。
  • 该方案仅要求你使用的C#编译器版本支持可空引用类型(C# 8.0及以上),和目标框架版本无关,.NET Framework 4.x、.NET Standard 2.0都可以正常使用。
  • 这些特性仅用于编译器静态分析,不会对程序运行逻辑产生任何影响,也不会增加运行时开销。

内容的提问来源于stack exchange,提问作者Michal Ciechan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:27:01