web-dev-qa-db-ja.com

outパラメータを使用してAction <>またはFunc <>を使用できますか?

outパラメーターを持つメソッドがあり、それにActionまたはFunc(または他の種類のデリゲート)を指定したいと思います。

これは正常に機能します。

static void Func(int a, int b) { }
Action<int,int> action = Func;

しかし、これはしません

static void OutFunc(out int a, out int b) { a = b = 0; }
Action<out int, out int> action = OutFunc; // loads of compile errors

これはおそらく重複していますが、「outparameter」の検索は特に有益ではありません。

37
Orion Edwards

ActionとFuncは、特にパラメーターを取り出したり参照したりしません。ただし、彼らは単なる代表者です。

ただし、outパラメータを取得するカスタムデリゲートタイプを作成して使用することはできます。

たとえば、次のように機能します。

class Program
{
    static void OutFunc(out int a, out int b) { a = b = 0; }

    public delegate void OutAction<T1,T2>(out T1 a, out T2 b);

    static void Main(string[] args)
    {
        OutAction<int, int> action = OutFunc;
        int a = 3, b = 5;
        Console.WriteLine("{0}/{1}",a,b);
        action(out a, out b);
        Console.WriteLine("{0}/{1}", a, b);
        Console.ReadKey();
    }
}

これは印刷されます:

3/5
0/0
56
Reed Copsey

いいえ、組み込みのデリゲートではありません。 outrefは特別な修飾子であり、デリゲートは完全に異なる呼び出しスタイルであるため、明示的に設定する必要があります。

ただし、独自のデリゲートを定義した場合は、次のことができます。

delegate void OutAction<T1, T2>(out T1 a, out T2 b);
2