你不能做到這一點,周圍有沒有辦法。其中一個原因是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);
但是你需要一個單獨的重載(和委託類型)爲每個參數和t他的代碼實際上看起來不太好。 (類型參數是必需的,類型推斷似乎不適用於此代碼。)
需要更多的代碼和一些關於這些變量作用域在哪裏的上下文。 – Matt 2013-02-10 17:06:58
他們在相同的範圍內。如果他們在不同的範圍內,我會表示它。只要讓我知道糾正,如果我誤解了你。 – hattenn 2013-02-10 17:08:53