带输出参数的Func <T>

我可以传递一个带有out参数的方法作为Func吗?

public IList<Foo> FindForBar(string bar, out int count) { } // somewhere else public IList<T> Find(Func<string, int, List<T>> listFunction) { } 

Func需要一个types,所以不会在那里编译,并且调用listFunction需要一个inttypes,并且不允许输出。

有没有办法做到这一点?

refout不是types参数定义的一部分,所以你不能使用内build的Func委托传递refout参数。 当然,如果你想要的话,你可以声明自己的委托:

 delegate V MyDelegate<T,U,V>(T input, out U output); 

为什么不创build一个类来封装结果?

 public class Result { public IList<Foo> List { get; set; } public Int32 Count { get; set; } } 

Func的代表家族(或者说Action )只不过是简单的代表types

 //.NET 4 and above public delegate TResult Func<out TResult>() public delegate TResult Func<in T, out TResult>(T obj) //.NET 3.5 public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2) public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3) 

等等。这样的代表可以有out / ref参数,所以在你的情况下,只有自己定制实现的问题,正如其他答案指出的那样。 至于为什么微软没有默认包装这个,想想它需要的组合数量。

 delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2) delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2) delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2) delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2) 

只有两个参数。 我们甚至没有触及到ref 。 这对于开发者来说实际上会很麻烦和混乱。

你可以把它包装在一个lambda /委托/函数/方法,暴露正确的接口,并调用FindForBar,但我怀疑FindForBar已经算作一个out参数作为一个原因,所以你需要确保扔掉的信息是确定/安全/理想/有正确的结果(即使您可以直接通过FindForBar,您也需要确定这一点)。