给定一个函数 async Task<(Boolean result, MyObject value)> TryGetAsync()
, 我能行
if((await TryGetAsync()) is var ret && ret.result)
{
//use ret.value
}
但是,如果我尝试使用声明类型或使用解构,则会出现错误“在此上下文中不允许声明”:
//declaration. error
if((await TryGetAsync()) is (Boolean result, MyObject value) ret && ret.result)
{
//use ret.value
}
//deconstruction, also error.
if((await TryGetAsync()) is (Boolean result, MyObject value) && result)
{
//use value
}
如何避免使用第一个选项 var ret
在这种情况下?我的问题是类型不明显(这是一个单独的讨论)。
最佳答案
The pattern matching specification不允许将值元组表示法作为有效的 type_pattern
在模式匹配语法中。
元组符号在编译器中被重写以使用 ValueTuple
.所以有一个选项:它确实适用于底层类型,ValueTuple<bool, MyObject>
:
if ((await TryGetAsync()) is ValueTuple<bool, MyObject> ret && ret.Item1)
虽然不理想,但它可以为您提供解决方法。
关于c# - 为模式匹配解构元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49647019/