4

メソッドがあるとしましょう:

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

これに似た何かを行う方法はありますか:

IEnumerable<string> result;

SomeMethod(out result);

編集:要点は、out 値を にバインドしたくないということです。string[]メソッド宣言が に変更されても、コードが機能するようにしたいと思いSomeMethod(out List<string> outputValue)ます。

4

3 に答える 3

5

型の安全性が保証されないため、出力パラメーターの型を変更することはできません。これについては、 Eric Lippert のブログで詳しく説明されています。

以下は、許可されている場合にタイプ セーフを破ることができるコード例です。

IEnumerable<string> result;

public void Test()
{
   SomeMethod(out result);
}

public void SomeMethod(out string[] someArray)
{
   someArray = new string[];
   ChangeTheType();

   int n = someArray.Length;    // BANG!! - someArray is now a List<string>
}

public void ChangeTheType()
{
    result = new List<string>();
}

明らかに、これは結果が SomeMethod の呼び出しと同じスコープ内にない場合にのみ問題になりますが、コンパイラはそれをチェックしません。許可されていません。

メソッドのシグネチャを に変更しpublic void SomeMethod(out IEnumerable<string> someStrings)ます。内部にstring[]を割り当てることができます。後で を使用することにした場合は、コールを中断することなくそれを割り当てることができます。someStringsSomeMethodList<string>

個人的には、最初に out パラメータを避けます: public string[] SomeMethod().

于 2013-02-10T19:52:59.087 に答える
2

あなたはそれをすることができず、それを回避する方法はありません。その理由の1つは、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);

ただし、パラメーターの数ごとに個別のオーバーロード(およびデリゲートタイプ)が必要になり、コードは実際にはそれほど良く見えません。(型パラメーターは必要です。型推論はこのコードでは機能しないようです。)

于 2013-02-10T19:46:24.150 に答える
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);
        }
    }
于 2013-02-10T17:24:50.627 に答える