【问题标题】:Using pattern matching to match an array with a non-zero lower bound使用模式匹配来匹配具有非零下限的数组
【发布时间】:2022-01-11 11:44:03
【问题描述】:

我正在编写通过 COM 自动化调用 Excel 宏的代码。需要处理不同的返回类型,模式匹配非常适合:

var result = ExcelApp.Run("MyMacro", ...);

return result switch
{
    object[,] array => ...,
    string message => ...,
    _ => throw new MyException("...")
};

因为它是 Excel,所以数组的下限是 1 而不是 0,这在 .NET 中得到完全支持。然而,令我惊讶的是,我发现当我尝试对下限为 1 的一维数组执行模式匹配时,模式不匹配。

详细来说,创建一个下界为 1 的 2×2 数组将匹配模式 object[,],即以下语句为 true

Array.CreateInstance(typeof(object), new[] { 2, 2 }, new[] { 1, 1 }) is object[,] array

但是,创建一个下限为 1(不正常)的 1×2 数组(只是一个包含两个元素的普通数组)将匹配模式 object[],即以下语句为false

Array.CreateInstance(typeof(object), new[] { 2 }, new[] { 1 }) is object[] array

这让我很惊讶,但是有没有一种模式可以用来匹配具有非零下限的一维数组?

【问题讨论】:

    标签: c# arrays excel pattern-matching excel-automation


    【解决方案1】:

    奇怪的是,模式匹配数组的规则对于一维数组是不同的,但因为数组有一个Rank 属性,它仍然是可能的:

    return result switch
    {
        Array { Rank: 1 } array => ...,
        // ... other cases
    };
    

    如果您想将基于 1 的数组(在上面的 array 中匹配)转换为普通的基于 0 的数组,可以这样做:

    array.Cast<object>().ToArray()
    

    由于下限不作为属性公开,而是需要方法调用 (GetLowerBound()),因此您无法对特定下限进行模式匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多