47 votes

void Func sans arguments

Il y a des questions similaires mais pas exactement comme la mienne.

Existe-t-il un équivalent de Func pour une fonction sans valeur de retour (i.e. void) et sans paramètres ?

La question connexe est la suivante Le func ne renvoie rien ? mais cela ne répond pas à un type de vide.

(J'en ai besoin pour demander des actions de mon modèle de vue à ma vue).

75voto

Anthony Pegram Points 58528

Votre formulation est confuse. Vous voulez peut-être dire "une fonction sans un type de retour et aucun paramètre." Il y a simplement System.Action .

Action action = () => Console.WriteLine("hello world");
action();

D'après votre commentaire :

Mais je dois remplir un <T> taper dans une Action et void n'est pas une possibilité (je vais modifier ma question, j'ai fait une erreur).

Cela indique un malentendu. Le T dans le délégué d'action est un entrée . Le vide est le sortie. Un délégué d'action est par nature un délégué qui renvoie un message vide. Le T est le type de entrée sur lesquels il peut agir, les paramètres que vous fournissez alors avec des arguments.

Quoi qu'il en soit, comme cette réponse et d'autres le montrent, vous pouvez avoir un délégué d'action sans aucun T, un délégué qui ne prend aucune entrée.

25voto

Oui, il y a différentes surcharges de Action en prenant un nombre différent de paramètres d'entrée et en ayant une void type de retour.

Action                public delegate void Action()
Action<T>             public delegate void Action<T>(T obj)
Action<T1,T2>         public delegate void Action<T1,T2>(T1 arg1, T2 arg2)
Action<T1,T2,T3>      public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3)
...

La première ligne est ce que vous recherchez.

Les versions plus récentes du Framework ont ajouté des surcharges avec encore plus d'arguments. Nombre maximum d'arguments :

  • .NET Framework 2.0 :   1
  • .NET Framework 3.5 :   4
  • .NET Framework 4.0 : 16
  • Silverlight :                   16

Les actions ont toujours un void le type de retour. A void Le type de retour ne doit pas et ne peut pas être spécifié comme paramètre de type générique. En revanche, le Func définissent des types de retour "réels" et ont toujours au moins un paramètre de type générique pour le type de retour. Voir aquí

Func<TResult>           public delegate TResult Func<TResult>()
Func<T,TResult>         public delegate TResult Func<T,TResult>(T arg)
Func<T1,T2,TResult>     public delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2)
...

.NET Framework 4.0 a ajouté in y out aux paramètres de type générique pour la contravariance et la covariance. Voir : Covariance et contravariance dans les génériques . Exemples :

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2)

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)

5voto

RyanR Points 5691

Ce que vous cherchez, c'est une action. Elle ne prend aucun paramètre et ne renvoie aucune valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X