带输出参数的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,并且不允许输出。
有没有办法做到这一点?
  ref和out不是types参数定义的一部分,所以你不能使用内build的Func委托传递ref和out参数。 当然,如果你想要的话,你可以声明自己的委托: 
 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,您也需要确定这一点)。