我可以使用out参数作为Func传递方法吗?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func需要一个类型,因此不能在那里编译,并且调用listFunction需要一个int并且不允许输入。
有办法做到这一点吗?
答案 0 :(得分:207)
ref
和out
不属于类型参数定义,因此您无法使用内置Func
委托来传递ref
和{{1}参数。当然,如果需要,您可以声明自己的代理:
out
答案 1 :(得分:23)
为什么不创建一个类来封装结果?
public class Result
{
public IList<Foo> List { get; set; }
public Int32 Count { get; set; }
}
答案 2 :(得分:13)
代理人Func
系列(或者Action
就此而言)只不过是简单的委托类型,如
//.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
。对开发人员来说实际上是麻烦和混乱。
答案 3 :(得分:0)
你可以将它包装在暴露正确接口并调用FindForBar的lambda / delegate / function /方法中,但是我怀疑FindForBar已经算作out参数作为一个原因,所以你需要确保抛出它信息离开是好的/安全的/可取的/得到了正确的结果(即使你可以直接传入FindForBar,你也需要确保这一点。)