Poiché Javascript è la lingua con cui sono più esperto, ho familiarità con l'utilizzo di funzioni come oggetti di prima classe. Avevo pensato che al C# mancava questa funzione, ma poi ho sentito parlare di Func
e di Action
e di delegate
, che penso siano piuttosto stupendi.Perché Func non accetta più di 16 argomenti?
Ad esempio, è possibile dichiarare una Func
che concatena due stringhe e mette uno spazio tra di loro in questo modo:
Func<string, string, string> concat = (a,b) => a + " " + b;
Ho notato che quando si digita
Func<
l'IntelliSense mostra che ha 17 sovraccarichi:
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>
Che mi ha fatto ridere. Ho guardato il MSDN docs per Func
e ho riso di nuovo. Questo mi ha fatto provare a dichiarare uno Func
con 17 argomenti. Causa un errore (Using the generic type 'System.Func<TResult>' requires 1 type arguments
).
Posso essere d'accordo sul fatto che probabilmente non è una buona idea avere uno Func
che accetta più di 16 argomenti. Anche così, questo sembra un modo scanzonato per l'implementazione di Func
. Richiede 17 sovraccarichi banalmente diversi da documentare. Questo è tutto ciò che dovrebbe davvero essere necessario sapere: l'ultimo parametro di tipo è il tipo di ritorno e tutti i parametri di tipo prima che siano i tipi di argomento.
Quindi cosa posso fare se volevo creare un Func
con più di 16 parametri? Perché c'è un limite comunque? Perché C# non può semplicemente dichiarare uno Func
con un numero arbitrario di argomenti?
Immagino perché se si provasse ad usare 'params' il tipo restituito verrebbe interpretato come un tipo di argomento. Ma non ho mai capito perché non potrebbe essere "Func" (dato che dichiari una funzione con prototipo (che ha un tipo di ritorno) quindi argomenti (ad esempio 'void Foo (a, b, c)')) –
È solo una semplice dichiarazione. I progettisti .NET si sono stancati dopo le 16. Se hai bisogno di qualcosa di più che dichiarare il tuo Func <>. –
@HansPassant Il punto è, perché devono continuare ad aggiungere sovraccarichi fino a quando non si stancano di esso? Perché non possono semplicemente avere un modo più generale di gestirlo, con un 'out TResult' e' in T' 0 o più volte? –