我能否使用带有out参数的Action<>或Func<>?

40
我有一个带有 out 参数的方法,我想将一个 ActionFunc(或其他类型的委托)指向它。

这个方法可以正常工作:


```csharp Action action = MyMethod; action(42); ```
```MyMethod``` 在这里是一个带有一个 ```int``` 类型的 ```out``` 参数的方法。
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 参数的 Func<T> - nawfal
2个回答

62

Action和Func不能直接使用out或ref参数,不过它们本质上都是委托类型。你可以创建一个自定义委托类型来处理需要用到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

在上面的例子中,类型 OutAction<T1, T2> 嵌套在类型 Program 中。这是完全可以的。但也有可能有非嵌套的委托类型,即 OutAction<T1, T2> 可以直接成为 namespace 的成员。 - Jeppe Stig Nielsen
补充这个答案,将委托作为参数传递可以使用类似于 DoSomething<T1, T2>(OutAction callback) { T1 first = 'someValue'; T2 second = 'someValue'; callback(out first, out second); } 的方式。 - Quad Coders

3
不,使用内置委托是不行的。outref是特殊限定符,因为它们具有完全不同的调用方式,所以必须显式地设置委托。但是,如果您定义了自己的委托,您可以这样做:
delegate void OutAction<T1, T2>(out T1 a, out T2 b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接