使用Append方法扩展数组类(此参考)

时间:2013-09-18 14:34:22

标签: c# visual-studio extension-methods

我想扩展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;
    }
}

但是“这个”不可能被引用......并且在返回时它会在开始时返回。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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