あなたはそれをすることができず、それを回避する方法はありません。その理由の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);
ただし、パラメーターの数ごとに個別のオーバーロード(およびデリゲートタイプ)が必要になり、コードは実際にはそれほど良く見えません。(型パラメーターは必要です。型推論はこのコードでは機能しないようです。)