Answers:
ref
并且out
不是类型参数定义的一部分,因此您不能使用内置的Func
委托来传递ref
和out
参数。当然,如果需要,您可以声明自己的委托:
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参数,因此在您的情况下,这仅是您自己执行的自定义问题,其他答案已指出。至于为什么Microsoft默认不打包,请考虑它需要的组合数量。
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
。对于开发人员而言,这实际上将是繁琐且令人困惑的。
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
和delegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
。因此,除了重载符号名的数量之外,Microsoft无法添加这些重载的另一个原因Func
。
您可以将其包装在一个lambda / delegate / function / method中,该方法公开了正确的接口并称为FindForBar,但是我怀疑FindForBar算作out参数是有原因的,因此您需要确保将信息丢弃确定/安全/理想/具有正确的结果(即使您可以直接传入FindForBar,也需要确定这一点)。
T
和V
协变。但是,由于output
类型的参数()U
是通过引用传递的,U
因此无法将其标记为协变或逆变,而必须保持“不变”。因此,请考虑public delegate V MyDelegate<in T, U, out V>(T input, out U output);
是否使用C#4或更高版本。