由於Javascript是我最熟練的語言,因此我熟悉使用函數作爲第一類對象。我曾以爲C#缺乏這個功能,但後來我聽說Func
和Action
和delegate
,我認爲這是非常棒的。爲什麼Funcs不能接受超過16個參數?
例如,你可以聲明一個Func
連接兩個字符串,並把這樣它們之間的空間:
Func<string, string, string> concat = (a,b) => a + " " + b;
我注意到,當你鍵入
Func<
的智能感知表明,有17個過載:
delegate System.Func<out TResult>
delegate System.Func<in T, out TResult>
delegate System.Func<in T1, in T2, out TResult>
...snip...
delegate System.Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>
這讓我發笑。我看着MSDN docs爲Func
又笑了起來。這讓我試圖用17個參數聲明Func
。它會導致錯誤(Using the generic type 'System.Func<TResult>' requires 1 type arguments
)。
我同意,這可能不是一個好主意,有一個Func
接受超過16個參數。即使如此,這似乎是Func
被執行的一種方式。它需要17個不同的重載記錄。這就是它真正需要知道的一切:最後一個類型參數是返回類型,並且它之前的所有類型參數都是參數類型。
所以我能做什麼,如果我想創造超過16個參數的Func
?爲什麼有一個限制呢?爲什麼C#不能讓你用任意數量的參數聲明Func
?
我可以想象,因爲如果你試圖用'params'返回類型將被解釋爲一個參數的類型。但是,我永遠無法理解爲什麼它不能是'Func鍵<出來回報,...>'(因爲你用聲明原型的函數(有返回類型),那麼參數(例如'無效美孚(A,B,C)' )) –
這只是一個簡單的聲明。 .NET設計師在16之後感到厭倦。如果您不僅僅需要聲明自己的Func <>, –
@HansPassant的一點是,爲什麼他們甚至有繼續增加的過載,直到他們看累了吧?爲什麼他們不能只有一種更一般的方式來處理它,只需要一個'out TResult'和'in T'0或更多次? –