[英]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.