如何使用out参数声明泛型委托

Ben*_*nny 25 .net c# generics out func

Func<a, out b, bool>,只是不编译,如何声明我想要第二个参数是out一个?

我想这样使用它:

 public class Foo()
 {
     public Func<a, out b, bool> DetectMethod;
 }
Run Code Online (Sandbox Code Playgroud)

And*_*zub 31

实际上,Func只是.NET Framework中声明的一个简单委托.实际上有几个Func代表在那里宣布:

delegate TResult Func<TResult>()
delegate TResult Func<T, TResult>(T obj)
delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)
delegate TResult Func<T1, T2, T3, T4, TResult>(T1 obj1, T2 obj2, T3 obj3, T4 obj4)
delegate TResult Func<T1, T2, ... , T16, TResult>(T1 obj1, T2 obj2, ..., T16 obj16)
Run Code Online (Sandbox Code Playgroud)

因此,您唯一能做的就是声明自定义委托:

delegate bool MyFunc<T1, T2>(T1 a, out T2 b)
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 7

您需要创建自己的委托类型,如下所示:

delegate bool MyFunc(Type1 a, out Type2 b);
Run Code Online (Sandbox Code Playgroud)


Ste*_*ven 6

您可能想重新考虑您的设计.您真的需要通过添加out参数来复杂化代码吗?

您可以将bool返回类型和第二个输出类型包装在它们自己的类(或.NET 4.0 Tuple)中,并将其用作返回类型:

public Func<Type1, Tuple<Type2, bool>> DetectMethod;
Run Code Online (Sandbox Code Playgroud)

当然,当您想要使用委托来引用try-parse方法时,您处于正确的轨道上,您需要像其他人已经描述的那样定义新的委托.