2011-07-13 1 views
2

私はクラス拡張に精通していますが、次の動作を期待していませんでした。System.Arrayの.NET C#クラスエクステンションを追加するには

私は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 
+6

私はあなたが「クラスエクステンションによく慣れている」というあなたの主張に疑問を呈します。エクステンションメソッドを意味すると仮定すると、これは完全に正常な動作です。拡張メソッドを再度読み上げる時間? –

+0

そう@ジョン。 :-) – IamIC

答えて

5

タイプのインスタンスに対してのみ、拡張メソッドを定義できるためです。彼らにあなたを呼び出すのいずれかの構文のように、インスタンスメソッド呼び出しを使用するには

var result = s.Concatenate(t); 

または標準静的メソッド呼び出しの構文

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

、あなただけのArrayのインスタンスに、Arrayにメソッドを追加することはできません(そして、実際にはメソッドを追加していないので、それはあなたのように見えるコンパイラのトリックです)。

はところで、私はちょうど私がのSystem.Arrayを拡張するために、次の予想

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

あなたの提案はありません。 Concatは配列ではなく文字列で動作します。 – IamIC

+2

@IanC:['System.Linq.Enumerable.Concat'](http://msdn.microsoft.com/en-us/library/bb302894.aspx)を使用しました。 – jason

3

としてあなたの方法を書きますが、それはしませんでした。代わりに、System.Arrayのインスタンスを拡張しました。どうして?

静的拡張メソッドを定義する方法がないため - 唯一のインスタンス拡張メソッドを定義することができる(From MSDN:):

拡張メソッドは、静的な方法の特別な種類であるが、それらはあるかのように呼ばれていますそれらは拡張型のインスタンスメソッドでした。

ただし、静的な方法であなたの拡張メソッドを呼び出しますが、あなたのクラスの拡張名を使用することができます

MyExtensions.Concatenate(s, f); 

これは、メソッドを定義するための非常にPython的な方法です。

関連する問題