web-dev-qa-db-fra.com

annuler Func sans arguments

Il y a des questions similaires mais pas exactement comme les miennes.

Existe-t-il un équivalent Func pour une fonction sans valeur de retour (c'est-à-dire void) et sans paramètres?

La question connexe est Func ne retourne rien? mais cela ne répond pas pour un type void.

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

30
Michel Keijzers

Votre libellé prête à confusion. 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();

De votre commentaire:

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

Cela indique un malentendu. Le T dans le délégué Action est un entrée. Le vide est la sortie . Un délégué Action est intrinsèquement un délégué renvoyant void. Le T est le type de entrée sur lequel il peut agir, les paramètres que vous fourniriez alors avec des arguments.

En tout cas, comme cette réponse et d'autres le montrent, vous pouvez avoir un délégué Action sans T, un délégué qui ne prend aucune entrée.

49
Anthony Pegram

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

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 correspond à ce que vous recherchez.

Les versions plus récentes de 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 type de retour void. Un type de retour void n'a pas besoin et ne peut pas être spécifié comme paramètre de type générique. En revanche, les délégués 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:

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é des modificateurs in et 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)
17

Ce que vous recherchez est une action. Il ne prend aucun paramètre et ne renvoie aucune valeur.

4
RyanR