186

我可以将带有 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 in。

有没有办法做到这一点?

4

4 回答 4

245

ref并且out不是类型参数定义的一部分,因此您不能使用内置Func委托来传递refout参数。当然,您可以根据需要声明自己的委托:

delegate V MyDelegate<T,U,V>(T input, out U output);
于 2009-08-15T23:54:27.253 回答
26

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

public class Result
{
     public IList<Foo> List { get; set; }
     public Int32 Count { get; set; }
}
于 2009-08-15T23:51:19.943 回答
15

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。对于开发人员来说,这实际上会很麻烦和困惑。

于 2013-12-13T06:26:06.950 回答
0

您可以将其包装在暴露正确接口并调用 FindForBar 的 lambda/delegate/function/method 中,但我怀疑 FindForBar 已将其作为输出参数作为原因,因此您需要确保将这些信息丢弃是ok/safe/desirable/有正确的结果(即使你可以直接传入 FindForBar,你也需要确定这一点)。

于 2009-08-15T23:52:10.580 回答