Подтвердить что ты не робот

Могу ли я иметь действие <> или Func <> с параметром out?

У меня есть метод с параметром 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

Это, вероятно, дубликат, но поиск параметра "out" не особенно плодотворен.

4b9b3361

Ответ 1

Действие и 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

Ответ 2

Нет, не со встроенными делегатами. out и ref являются специальными квалификаторами, и делегат должен быть настроен с ними явно, так как они совершенно разные стили вызовов.

Однако, если вы определили свой собственный делегат, вы можете сделать это:

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