簡體   English   中英

如何添加 System.Array 的.Net C# class 擴展

[英]How do I add .Net C# class extension of System.Array

我對 class 擴展非常熟悉,但沒想到會出現以下行為。

我希望以下內容能夠擴展 System.Array,但事實並非如此。 相反,它擴展了 System.Array 的實例 為什么?

public static T[] Concatenate<T>(this Array value1, Array value2)
{
    int l1 = value1 == null ? 0 : value1.Length;
    int l2 = value2 == null ? 0 : value2.Length;

    T[] result = new T[l1 + l2];

    if (l1 > 0)
    {
        Array.Copy(value1, 0, result, 0, l1);
    }

    if (l2 > 0)
    {
        Array.Copy(value2, 0, result, l1, l2);
    }

    return result;
}

...

大批。 // 沒有連接

string[] s = new string[1];
s.Concatenate<string>... // appears here

因為您只能為類型的實例定義擴展方法。 要調用它們,您可以使用類似語法的實例方法調用

var result = s.Concatenate(t);

或標准的靜態方法調用語法

var result = ArrayExtensions.Concatenate(s, t);

同樣,您不能將方法添加到Array ,只能添加到Array的實例(實際上,您並沒有添加方法,它只是一個編譯器技巧,使它看起來像您所做的那樣)。

順便說一句,我只想把你的方法寫成

return value1.Concat(value2).ToArray();

我希望以下內容能夠擴展 System.Array,但事實並非如此。 相反,它擴展了 System.Array 的實例。 為什么?

因為沒有辦法定義 static 擴展方法 - 只能定義實例擴展方法(來自 MSDN :):

擴展方法是一種特殊的 static 方法,但它們被稱為擴展類型上的實例方法。

但是,您可以以 static 方式調用您的擴展方法,但使用您的 class 擴展名:

MyExtensions.Concatenate(s, f);

這是定義方法的 Pythonic 方式。

暫無
暫無

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

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