将string []的out参数作为IEnumerable <string> </string>

时间:2013-02-10 17:01:47

标签: c# ienumerable out

假设我们有一个方法:

public void SomeMethod(out string[] someArray) { // ... }

有没有办法做类似的事情:

IEnumerable<string> result;

SomeMethod(out result);

编辑:重点是,我不想将out值绑定到string[],即使方法声明更改为{{I},我也希望代码能够正常工作1}}。

2 个答案:

答案 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);

但是你需要为每个参数提供一个单独的重载(和委托类型),而且代码实际上看起来并没有那么好。 (类型参数是必需的,类型推断似乎不适用于此代码。)