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

しかし、「これ」は参照することができません...そして戻ると最初のように戻ります。

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 に答える