带输出参数的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,您也需要确定这一点)。