Un délégué d'une fonction à nombre variable de paramètres
J'ai une fonction de ce genre
void func(params object[] parameters) {
//Function Body
}
Il peut accepter des paramètres du tri suivant
func(10, "hello", 30.0);
func(10,20);
et ainsi de suite.
J'ai voulu créer un Action
délégué à la fonction ci-dessus. Est-il possible? Si non, alors pourquoi?
- Non, c'est assez marrant ce problème a été discuté une demi-heure! stackoverflow.com/a/25689676/1663001
- stackoverflow.com/questions/4059624/...
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser l'existant
Action
déléguésparams
, mais vous pouvez déclarer votre propre délégué de cette façon:Alors:
Bien sûr, vous peut créer un
Action<object[]>
pour votre méthode, mais vous perdez laparams
aspect de celui-ci, que ce n'est pas déclarée dansAction<T>
. Ainsi, par exemple:Donc, si vous êtes appel le délégué de code qui veut utiliser
params
, vous avez besoin d'un type délégué qui comprend que, dans la déclaration (comme pour la première partie). Si vous souhaitez simplement créer un délégué qui accepte unobject[]
, vous pouvez créer un instance deAction<object[]>
à l'aide d'une méthode qui aparams
dans sa signature, c'est juste un modificateur de manière efficace.C'est là où on atteint les limites de la fonctionnelle de la programmation en C#: vous ne pouvez pas avoir un délégué avec un nombre variable de façon générique-les paramètres typés (le
Action
les délégués ont un nombre fixe de paramètres génériques). Mais vous trouverez peut-être utile pour créer des génériques des surcharges pour chaque nombre de paramètres:Ce que cela vous gagne, c'est la capacité à transmettre ces fonctions en tant que paramètres (c'est à dire, à transmettre, tout simplement, sans utiliser les expressions lambda). Donc, si vous avez une fonction comme ceci:
Ensuite, vous pouvez l'appeler comme ceci:
you can not have a delegate with a variable number of parameters
Bien sûr vous pouvez.Action
délégués.Action
avec un nombre variable de paramètres.Action
délégué, qui est ce que j'étais en travaillant à l'extérieur. De toute façon, j'ai mis à jour ma réponse à clarifier mon sens.params object[]
. La réponse est simple, vous pouvez créer undelegate
qui fait que, tout simplement pas uneAction
qui le fait.Action
était arbitraire ou erronée. Ma réponse est certes un peu orthogonale, mais mon intuition est que la coopérative doit faire usage du délégué dans la façon dont je l'ai suggéré.