如何让自定义TryGetString方法的IntelliSense可空性警告与TryGetValue一致?
让IntelliSense识别自定义TryGet方法返回true时out参数非空
在Visual Studio中,IntelliSense能识别Dictionary<string, string>.TryGetValue(string key, out string value)返回true时,out参数value不为null。我想复刻这个行为,但不知道怎么操作:如何让IntelliSense识别自定义TryGetString()返回true时,out参数result不为null?
注意:必须保持TryGetString()返回false时仍触发可空性检查,和Dictionary.TryGetValue的行为一致。
问题代码示例
public class TestClass { private int Number = 3; private bool TryGetString(out string? result) { // 返回false时result为null if (Number > -1) { result = Number.ToString(); return true; } result = null; return false; } public void Init() { if (TryGetString(out var result)) { string a = result; // 这里Visual Studio会弹出null警告,但实际上这个分支里result不可能为null } } }
解决方案
你需要使用System.Diagnostics.CodeAnalysis命名空间下的**[MemberNotNullWhen]特性**,它能告诉编译器:当方法返回指定布尔值时,对应的out参数一定不为null。
修改后的代码如下:
using System.Diagnostics.CodeAnalysis; public class TestClass { private int Number = 3; // 标注:当方法返回true时,result参数不为null private bool TryGetString([NotNullWhen(true)] out string? result) { if (Number > -1) { result = Number.ToString(); return true; } result = null; return false; } public void Init() { if (TryGetString(out var result)) { string a = result; // 这里不再出现null警告 } // 返回false的场景仍会触发可空性检查 TryGetString(out var failedResult); string b = failedResult; // 这里会正常弹出null警告,符合预期 } }
说明
[NotNullWhen(true)]特性明确告知编译器:TryGetString返回true时,out参数result肯定不为null,因此在if分支内使用result不会触发null警告。- 当方法返回
false时,result可能为null,编译器依然会对未做null校验的使用场景发出警告,和Dictionary.TryGetValue的行为完全一致。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

