Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用out参数声明泛型委托_C#_.net_Generics_Func_Out - Fatal编程技术网

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

C# 如何使用out参数声明泛型委托,c#,.net,generics,func,out,C#,.net,Generics,Func,Out,Func,只是不编译,如何声明第二个参数是out参数 我想这样使用它: public class Foo() { public Func<a, out b, bool> DetectMethod; } delegate bool MyFunc(Type1 a, out Type2 b); 公共类Foo() { 公共函数检测法; } 您需要创建自己的委托类型,如下所示: public class Foo() { public Func<a, ou

Func
,只是不编译,如何声明第二个参数是
out
参数

我想这样使用它:

 public class Foo()
 {
     public Func<a, out b, bool> DetectMethod;
 }
delegate bool MyFunc(Type1 a, out Type2 b);
公共类Foo()
{
公共函数检测法;
}

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

 public class Foo()
 {
     public Func<a, out b, bool> DetectMethod;
 }
delegate bool MyFunc(Type1 a, out Type2 b);

实际上,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)
delegate TResult Func()
委托结果函数(T obj)
委托TResult Func(T1 obj1、T2 obj2)
委托结果函数(T1 obj1、T2 obj2、T3 obj3)
委托结果函数(T1 obj1、T2 obj2、T3 obj3、T4 obj4)
委托结果函数(T1 obj1、T2 obj2、…、T16 obj16)
因此,您只能声明自定义委托:

delegate bool MyFunc<T1, T2>(T1 a, out T2 b)
delegate bool MyFunc(T1 a,out T2 b)

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

您可以将bool返回类型和second out类型包装在它们自己的类(或.NET 4.0元组)中,并将其用作返回类型:

public Func<Type1, Tuple<Type2, bool>> DetectMethod;
公共函数检测方法;

当然,当您想使用委托引用try parse方法时,您的思路是正确的,您需要定义一个新的委托,就像前面所描述的其他委托一样。

Yes。泛型
Func
委托是采用常规类型参数的常规泛型类型
out b
不是一种类型。这也比带有ref或out参数的自定义委托更便于LINQ。