首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配解构元组

模式匹配解构元组
EN

Stack Overflow用户
提问于 2018-04-04 09:08:36
回答 2查看 872关注 0票数 12

给定一个函数async Task<(Boolean result, MyObject value)> TryGetAsync(),我可以

代码语言:javascript
复制
if((await TryGetAsync()) is var ret && ret.result)
{
    //use ret.value
}

但是,如果我试图使用声明类型或使用解构式获取一个错误,“在这种情况下不允许声明”:

代码语言:javascript
复制
//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?我的问题是,类型并不明显(这是一个单独的讨论)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-04 09:20:06

模式匹配规范不允许值元组表示法作为模式匹配语法中的有效type_pattern

在编译器中重写元组表示法以使用ValueTuple。因此有一个选项:它确实与底层类型ValueTuple<bool, MyObject>一起工作。

代码语言:javascript
复制
if ((await TryGetAsync()) is ValueTuple<bool, MyObject> ret && ret.Item1)

虽然不理想,但它可以为你提供一个解决办法。

票数 9
EN

Stack Overflow用户

发布于 2021-03-19 10:54:33

在C# 8.0中,您可以使用最后一个选项并没有错误:

代码语言:javascript
复制
if((await TryGetAsync()) is (Boolean result, MyObject value) && result)
{
    //use value
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49647019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档