简体   繁体   中英

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

I am quite familiar with class extensions, but wasn't expecting the following behavior.

I expected the following to extend System.Array, but it didn't. Instead, it extended instances of System.Array. Why?

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;
}

...

Array. // no Concatenate

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

Because you can only define extension methods for instances of types. To invoke them you either use the instance-method invocation like syntax

var result = s.Concatenate(t);

or the standard static-method invocation syntax

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

Again, you can not add methods to Array , only to instances of Array (and really, you aren't adding methods, it's just a compiler trick that makes it look like you did).

By the way, I would just write your method as

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

I expected the following to extend System.Array, but it didn't. Instead, it extended instances of System.Array. Why?

Because there is no way to define static extensions method - only instance extension method can be defined ( From MSDN: ):

Extension methods are a special kind of static method, but they are called as if they were instance methods on the extended type.

However, you can call your extension method in static manner, but using your class extension name:

MyExtensions.Concatenate(s, f);

It's very Pythonic way to define methods.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM