0

我想扩展 System.Array 类来做这样的事情:

public static class Extensions
{
    public static void Append( this byte[] dst, byte[] src)
    {
        Array.Resize<byte>(ref dst, dst.Length + src.Length);
        Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
        return;
    }
}

但是“this”是不可能被引用的......并且在返回时它会像开始一样返回。

4

2 回答 2

4

如果您的意思是“我可以将扩展方法的第一个ref参数设为参数吗?” 那么答案是否定的,你不能。(无论如何,不​​在 C# 中。IIRC,你可以在 VB 中 - 但我建议不要这样做。)

从 C# 规范的第 10.6.9 节:

扩展方法的第一个参数不能有除 以外this的修饰符,参数类型不能是指针类型。

您必须改为返回数组:

public static byte[] Append(this byte[] dst, byte[] src)
{
    Array.Resize(ref dst, dst.Length + src.Length);
    Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
    return dst;
}

然后将其称为:

foo = foo.Append(bar);

不过,在这一点上真的感觉你想要一个List<byte>- 如果你真的要制作这样的扩展方法,至少让它通用:

public static T[] Append<T>(this T[] dst, T[] src)
{
    Array.Resize(ref dst, dst.Length + src.Length);
    Array.Copy(src, 0, dst, dst.Length - src.Length,src.Length);
    return dst;
}
于 2013-09-18T14:36:39.853 回答
0

是的,扩展方法的隐式参数不可能有ref修饰符。您正在寻找的东西根本不可能;您需要使用非扩展方法来获得此行为,或者您需要返回一个新数组而不是修改隐式引用。

于 2013-09-18T14:36:43.307 回答