假设我们有一个方法:
public void SomeMethod(out string[] someArray) { // ... }
有没有办法做类似的事情:
IEnumerable<string> result;
SomeMethod(out result);
编辑:重点是,我不想将out值绑定到string[]
,即使方法声明更改为{{I},我也希望代码能够正常工作1}}。
答案 0 :(得分:2)
我确定这不是最佳方式,但您可以编写另一种方法为您完成这项工作:
public class ClassA
{
private void SomeMethod(out IEnumerable<string> result)
{
string[] res;
SomeMethod(out res);
result = res;
}
public void SomeMethod(out string[] someArray)
{
someArray = new string[2];
}
void Test()
{
IEnumerable<string> result;
SomeMethod(out result);
}
}
答案 1 :(得分:2)
你无法做到这一点,没有办法解决这个问题。其中一个原因是CLR不支持out
,只支持ref
。所以out
实际上表示为ref
,并且C#编译器添加了一些特殊规则。
最简单(也很明显)的方法是创建一个单独的变量:
string[] resultArray;
SomeMethod(out resultArray);
IEnumerable<string> result = resultArray;
您可以创建一个辅助方法来为您执行该转换:
public delegate void ActionWithOut<T>(out T result);
public static void ConvertOut<TBase, TDerived>(
ActionWithOut<TDerived> method, out TBase result)
where TDerived : TBase
{
TDerived derived;
method(out derived);
result = derived;
}
用法:
IEnumerable<string> result;
ConvertOut<IEnumerable<string>, string[]>(SomeMethod, out result);
但是你需要为每个参数提供一个单独的重载(和委托类型),而且代码实际上看起来并没有那么好。 (类型参数是必需的,类型推断似乎不适用于此代码。)