C#out参数欺骗?

Tim*_*ews 3 c# parameters

嗨,我有与此类似的C#代码:

int someNumber;
Thing someThing;

doStuff(out someNumber);
someThing = new Thing(someNumber); 
Run Code Online (Sandbox Code Playgroud)

我想知道的是,是否有任何方法可以删除someNumber并直接在参数参数中实例化someThing.

编辑actaul代码给了我8个参数,但我只是想保持简单所以它更像是:

int someNumber1, someNumber2, somNumber3, someNumber4,
someNumber5, someNumber6, someNumber7, someNumber8;

Thing someThing1, someThing2, someThing3, someThing4,
someThing5, someThing6, someThing7, someThing8;

doStuff(out someNumber1, out someNumber2, out someNumber3, out someNumber4,
out someNumber5, out someNumber6, out someNumber7, out someNumber8);

someThing1 = new Thing(someNumber1); etc.....................
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

好吧,如果你发现自己经常这样做,你可以这样做:

public delegate void OutAction<T>(out T value);

public TResult UseOut<TIntermediate,TResult>
    (OutAction<TIntermediate> outAction,
     Func<TIntermediate,TResult> selector)
{
    TIntermediate tmp;
    outAction(out tmp);
    return selector(tmp);
}
Run Code Online (Sandbox Code Playgroud)

然后调用它(注意doStuff这里是一个方法组 - 缺乏()是故意的!):

Thing someThing = UseOut(doStuff, x => new Thing(x));
Run Code Online (Sandbox Code Playgroud)

我不一定说这是一个好主意,只需考虑一下.

编辑:当你开始获得多个参数时,它变得更加困难 - 因为out参数可能是第一,第二,第三,第四等...

编辑:稍微简单的版本:

public TResult ReturnOut<TResult>(OutAction<TResult> outAction)
{
    TResult tmp;
    outAction(out tmp);
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

用法:

Thing someThing = new Thing(ReturnOut(doStuff));
Run Code Online (Sandbox Code Playgroud)