与这个问题类似,我决定看看是否可以将out
参数从方法中提取到隐式类型变量中,而无需定义类型。我理想的解决方案如下所示:
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;
在这种情况下,CallMyMethod
有 2 个普通输入变量、3 个out
参数和一个返回值。我希望编译器根据传入的委托的语义自动确定o1
、o2
、o3
和的类型。所以我为输出参数的每个组合创建了一些辅助委托和方法。以下是 3 个参数的示例:returnValue
LiftOutParam
out
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);
}
理论上,编译器应该能够根据委托的语义来确定类型T1
、、、T2
和。但是,除非我在委托中指定每个参数的类型,否则上述代码不会编译。T3
TReturn
(out p1, out p2, out p3) => { return CallMyMethod(i1, i2, out p1, out p2, out p3); }
out
有没有办法做我想要完成的事情?编写一个通用的辅助方法,可以将out
参数的值拉入隐式类型的局部变量,而无需在任何地方显式定义类型?