给定一个函数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
?我的问题是类型不明显(这是一个单独的讨论)。
答案 0 :(得分:9)
The pattern matching specification不允许将值元组表示法作为模式匹配语法中的有效./
。
在编译器中重写元组符号以使用type_pattern
。所以有一个选项:它可以使用基础类型ValueTuple
:
ValueTuple<bool, MyObject>
虽然不理想,但它可以为您提供解决方法。
答案 1 :(得分:1)
在 C# 8.0 中,您可以使用最后一个选项并且不会出错:
if((await TryGetAsync()) is (Boolean result, MyObject value) && result)
{
//use value
}