Func <t>没有参数</t>

时间:2009-08-15 23:45:59

标签: c# .net linq generics func

我可以使用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并且不允许输入。

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:207)

refout不属于类型参数定义,因此您无法使用内置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,你也需要确保这一点。)