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

如何标注C#方法:当参数为true时返回非空可空引用类型

问题:C#可空上下文中标记方法的条件非空返回值

在C#可空上下文环境下,我编写了如下代码:

public string? GetValue(int key, bool errorIfInvalidKey)
{
    string result = <根据key获取对应值,无匹配则返回null>;
    if (result == null && errorIfInvalidKey) {
        throw new InvalidOperationException("Bad key");
    } else {
      return result;
    }
}

当调用者传入无效的key时,errorIfInvalidKey参数用于指定返回null还是抛出异常。因此,当errorIfInvalidKey为true时,该方法保证返回非空值。

请问是否存在代码标注方式,可告知编译器:当参数取特定值时,原本可能返回null的方法将返回非空值?


解决方案

可以使用C# 8.0及后续版本提供的[NotNullWhen]特性(属于System.Diagnostics.CodeAnalysis命名空间),它能明确告知编译器:当指定参数为特定值时,方法的返回值是非空的。

修改后的代码示例

using System.Diagnostics.CodeAnalysis;

[return: NotNullWhen(true, nameof(errorIfInvalidKey))]
public string? GetValue(int key, bool errorIfInvalidKey)
{
    string? result = <根据key获取对应值,无匹配则返回null>;
    if (result == null && errorIfInvalidKey)
    {
        throw new InvalidOperationException("Bad key");
    }
    return result;
}

也可以将特性直接标注在参数上,效果一致:

using System.Diagnostics.CodeAnalysis;

public string? GetValue(int key, [NotNullWhen(true)] bool errorIfInvalidKey)
{
    string? result = <根据key获取对应值,无匹配则返回null>;
    if (result == null && errorIfInvalidKey)
    {
        throw new InvalidOperationException("Bad key");
    }
    return result;
}

添加该标注后,编译器会识别出:当errorIfInvalidKey为true时,GetValue的返回值一定是非空的,调用方在这种场景下使用返回值时,不会触发可空性相关的编译警告。


内容的提问来源于stack exchange,提问作者Bob.at.Indigo.Health

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:50:40