c# - 为模式匹配解构元组

标签 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在这种情况下?我的问题是类型不明显(这是一个单独的讨论)。

最佳答案

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/

相关文章:

c# - WinForms - 在 TableLayoutPanel 中重叠两个控件

python - 在 Python 中使用 Stanford Tregex

Haskell 模式匹配——如何使用常量变量

scala - 当一个 arg 预期时,零 arg 模式匹配

用于 Mark Nelson 实现 Ukkonen 算法的后缀树中首次出现模式 s 的 java 模式匹配

c# - 使用 SendGrid SMTP 电子邮件提交时出现 Bad Request 错误

C# 内存模型、锁定和同步

c# - 如何设置 Json.Net 序列化程序以自定义方式运行?

c# - XNA StreamReader/Writer如何在不同的行中读/写?

regex - 在文本文件中加入具有特定模式的行