如何解决是否有等效的 NotNullWhen C# 模式用于异步元组返回?
在具有可空类型的 C# 中,可以实现一个“TryGet”,它对空检查很聪明,例如,
bool TryGetById(int id,[NotNullWhen(returnValue: true)] out MyThing? myThing)
允许调用者跳过对 out var myThing 的空检查。
不幸的是,Async 不允许输出参数,并且使用元组返回的模式不允许这种智能的 NotNull 检查(至少,我发现不是这样)。有没有替代品?
有没有办法在异步元组返回类型上使用“NotNullWhen”等价物,例如
Task<(bool Ok,[NotNullWhen(returnValue: true)] MyThing? MyThing)> TryGetById(int id)
解决方法
对于值元组(目前)还没有实现。然而!从 C#9 你可以推出自己的 struct
(或者更好的C#10 > 用MemberNotNullWhen
录制struct
)。
MemberNotNullWhenAttribute Class
指定方法或属性将确保列出的 字段和属性成员在返回时具有非空值 指定的返回值条件。
注意:您需要重新实现所有 tupley 优点,例如平等等。
世界上最做作的例子来了
#nullable enable
public readonly struct Test
{
[MemberNotNullWhen(returnValue: true,member: nameof(Value))]
public bool IsGood => Value != null;
public string? Value { get; init; }
}
public static Task<Test> TryGetAsync()
=> Task.FromResult(new Test {Value = "bob"});
public static void TestMethod(string bob)
=> Console.WriteLine(bob);
使用
var result = await TryGetAsync();
if (result.IsGood)
TestMethod(result.Value); // <= no warning
,
如果您拥有 MyThing
的实现,您可以这样做
public class MyThing
{
public static readonly MyThing Empty = new();
// all other properties etc
}
然后使您的方法签名永远不会返回 null Mything
public async Task<(bool Ok,MyThing MyThing)> TryGetById(int id)
{
var something = await FindSomething(id);
return (something == null)
? (false,MyThing.Empty);
: new (true,something);
}
var result = await TryGetById(420);
if(result.Ok) // whatever
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。