簡體   English   中英

使用模式匹配來匹配具有非零下限的數組

[英]Using pattern matching to match an array with a non-zero lower bound

我正在編寫通過 COM 自動化調用 Excel 宏的代碼。 需要處理不同的返回類型,模式匹配非常適合:

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

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

因為它是 Excel,所以 arrays 的下限是 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

這讓我感到驚訝,但是有沒有一種模式可以用來匹配具有非零下限的一維數組?

奇怪的是,模式匹配 arrays 的規則對於一維 arrays 是不同的,但由於數組具有Rank屬性,它仍然是可能的:

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

如果您想將基於 1 的數組(在上面的array中匹配)轉換為普通的基於 0 的數組,可以這樣做:

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

因為下限沒有作為屬性公開,而是需要一個方法調用( GetLowerBound() ),所以您不能在特定的下限上進行模式匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM