如何标注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
相关产品推荐
相关产品推荐

