解构元组以进行模式匹配

时间:2018-04-04 09:08:36

标签: c# pattern-matching

给定一个函数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?我的问题是类型不明显(这是一个单独的讨论)。

2 个答案:

答案 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
}