的Func
家族的代表(或Action
爲此事)是什麼,但聲明如下
//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)
//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)
等代表簡單的委託類型因爲這樣可以有out/ref參數,所以在你的情況下,只有你自己定製實現的問題,正如其他答案指出的那樣。至於爲什麼微軟沒有默認包裝這個,想想它需要的組合數量。
delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)
只有兩個參數。我們甚至沒有碰過ref
。這對於開發者來說實際上會很麻煩和混亂。
如果有人像我一樣感到困惑,你不會*像*內建的那樣*調用你的委託「Func」... – Dunc 2013-03-27 14:58:56
@Dunc - 修正。如果不是您的評論,我會感到非常困惑。 – 2014-04-12 00:08:27
在C#4(2010)及更高版本(在您寫答案時未發佈),可以將「T」標記爲逆變,將「V」標記爲協變。然而,由於類型'U'的參數('output')通過引用***被***傳遞,所以'U'不能被標記爲共同或逆變,並且必須保持「不變」。所以考慮在T,U,out V>(T輸入,U輸出)中的公共代理V MyDelegate <如果使用C#4或更高版本。 – 2014-04-22 10:04:28