In a similar vein to this question, I decided to see if it was possible to pull out parameters from a method into implicitly-typed variables without having to define the types. My ideal solution would look something like this:
var result = LiftOutParam((out p1, out p2, out p3) => {
return CallMyMethod(i1, i2, out p1, out p2, out p3);
});
var o1 = result.Item1;
var o2 = result.Item2;
var o3 = result.Item3;
var returnValue = result.Item4;
In this case, CallMyMethod has 2 normal input variables, 3 out parameters, and a return value. I want the compiler to automatically determine the types of o1, o2, o3, and returnValue based on the semantics of the delegate passed into LiftOutParam. So I created some helper delegates and methods, for each combination of out parameters. Here's an example for 3 out parameters:
public delegate TReturn Lift<T1, T2, T3, TReturn>(
out T1 o1, out T2 o2, out T3 o3);
public static Tuple<T1, T2, T3, TReturn> LiftOutParam<T1, T2, T3, TReturn>(
Lift<T1, T2, T3, TReturn> Lift) {
T1 o1;
T2 o2;
T3 o3;
TReturn ret = Lift(out o1, out o2, out o3);
return new Tuple<T1, T2, T3, TReturn>(o1, o2, o3, ret);
}
In theory, the compiler should be able to determine the types T1, T2, T3, and TReturn based on the semantics of the delegate (out p1, out p2, out p3) => { return CallMyMethod(i1, i2, out p1, out p2, out p3); }. However, the above code doesn't compile unless I specify the types of each of the out parameters in the delegate.
Is there a way to do what I'm trying to accomplish? To write a generic helper method that can pull the values of out parameters into implicitly-typed local variables without having to explicitly define the types anywhere?