如何为返回元组的C#方法添加注解以支持空状态静态分析
结论
目前C#的可空静态分析暂不支持直接对返回元组的单个元素添加条件非空注解,你需要的[NotNullWhen]效果暂时没法直接应用在元组返回值的成员上。
可以用以下两种方案实现同等效果:
方案1:改用传统TryXXX方法签名(推荐,全版本兼容)
直接把元组的第二个值拆成out参数,搭配[NotNullWhen]特性即可,和你示例的写法完全一致:
public static bool TryGetType(string name, [NotNullWhen(true)] out Type? type) { if (NameToTypeMap.TryGetValue(name, out type)) { return true; } type = null; return false; }
调用时只要判断返回值为true,静态分析就会自动判定type非空。
方案2:自定义包装类型(兼容元组写法,要求.NET 5+ / C# 9+)
如果一定要保留元组形式的调用习惯,可以自定义一个轻量的结果结构,配合[MemberNotNullWhen]特性实现条件非空判断:
// 自定义结果结构,支持和元组隐式互转 public readonly struct TypeQueryResult { [MemberNotNullWhen(true, nameof(Value))] public bool Success { get; } public Type? Value { get; } public TypeQueryResult(bool success, Type? value) { Success = success; Value = value; } public static implicit operator (bool Success, Type? Value)(TypeQueryResult result) => (result.Success, result.Value); public static implicit operator TypeQueryResult((bool Success, Type? Value) tuple) => new(tuple.Success, tuple.Value); } // 改造后的方法 public static TypeQueryResult GetType(string name) { if (NameToTypeMap.TryGetValue(name, out var type)) { return (true, type); } return (false, null); }
调用时写法和原来完全一致,判断Success为true时,Value会被静态分析判定为非空:
var result = GetType("TestType"); if (result.Success) { // 这里result.Value不会触发空警告 Console.WriteLine(result.Value.FullName); }
内容的提问来源于stack exchange,提问作者Piotr Pasieka
相关产品推荐
相关产品推荐

