没有参数的 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 需要一个类型,所以 out 不会在那里编译,而调用 listFunction 需要一个 int 类型,不允许 out 类型进入。

有办法吗?

62477 次浏览

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

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

你可以把它封装在一个 lambda/committee/function/方法中,这个方法暴露了正确的接口,并且叫做 FindForBar,但是我怀疑 FindForBar 有一个 out 参数作为原因,所以你需要确保抛弃这些信息是 OK/safe/ 合适的结果(即使你可以直接传递到 FindForBar 中,你也需要确保这一点)。

refout不是类型参数定义的一部分,因此不能使用内置的 Func委托传递 refout参数。当然,如果你愿意的话,你可以声明你自己的代表:

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

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。它实际上会是繁琐和混乱的开发人员。