C# 7 模式匹配

标签 c# pattern-matching c#-7.0

假设我有以下异常过滤器

try {
    ...
} catch (Exception e) when (e is AggregateException ae && ae.InnerException is ValueException<int> ve || e is ValueException<int> ve) {
    ...
}

我本可以简单地编写两个单独的 catch block ,但我想看看如何使用模式匹配功能来捕获 本身或包裹在 AggregateException 中。然而,在这里,编译器提示 ve 的重新定义,这是可以理解的。我见过一个模式匹配变量在同一表达式中重复使用的情况,如下所示:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }

所以可能有一种方法可以做我想做的事。或者有吗?

最佳答案

您不能声明 ve在同一范围内变量两次。但是您可以重写异常过滤器,以便 ValueException<int> 的变量将只声明一次:

catch(Exception e) 
  when (((e as AggregateException)?.InnerException ?? e) is ValueException<int> ve)
{
   // ...
}

如果异常被直接抛出或被包装到 AggregateException 中,这是您捕获异常的唯一方法。 .

请记住 AggregateException 的目的正在将多个异常合并到一个异常对象中。可能有多个内部异常,其中一些也可能是聚合异常。因此,您应该展平聚合异常并检查其所有内部异常。


您可以将“展开”部分放入扩展方法中以提高代码的可读性。

关于C# 7 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234892/

相关文章:

c# - 在中继器控制中设置中断

c# - C# 中的 Google Firebase URL 缩短器

arrays - LIKE 查询平面 jsonb 数组的元素

c# - C# 7.0 中的 Ref 返回限制

c# - C# 7.0 中的泛型函数和 ref 返回

c# - 密码重置时 ASP.Net Identity “Invalid token”,密码中带 *

c# - 在创建表 SQL Server 命令中引用默认值

angularjs - 正则表达式验证输入字段中单词的第一个字母不是特殊字符

string - 了解 Knuth-Morris-Pratt 算法

c# - 是否可以解构出 ValueTuple 参数?