void Func без аргументов - PullRequest
       0

void Func без аргументов

30 голосов
/ 12 февраля 2012

Есть некоторые похожие вопросы, но не совсем такие, как у меня.

Есть ли эквивалент Func для функции без возвращаемого значения (т.е. void) и без параметров?

Связанный вопрос Функция не возвращает ничего? , но это не отвечает для типа void.

(мне нужно запросить действия из моей модели представления в мое представление).

Ответы [ 3 ]

49 голосов
/ 12 февраля 2012

Ваша формулировка сбивает с толку.Возможно, вы имеете в виду «функцию без возвращаемого типа и без параметров».Существует просто System.Action .

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

Из вашего комментария:

Но мне нужно заполнить тип <T> в действии ианнулирование не возможно (я отредактирую свой вопрос, я сделал ошибку).

Это указывает на недоразумение.T в делегате Action - это input .Void - это вывод . Делегат Action по своей сути является делегатом, возвращающим void.T - это тип input , на который он может воздействовать, параметры, которые вы затем предоставите с аргументами.

В любом случае, как показывают этот ответ и другие, вы можете иметь делегата Action без T, который не принимает никаких входных данных.

16 голосов
/ 12 февраля 2012

Да, существуют различные перегрузки Action, принимающие различное количество входных параметров и имеющие тип возврата 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)
...

Первая строка - это то, что вы ищете.

В более новых версиях Framework добавлены перегрузки с еще большим количеством аргументов.Максимальное количество аргументов:

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

Действия всегда имеют тип возврата void.void возвращаемый тип не требуется и не может быть указан в качестве параметра универсального типа.Напротив, делегаты Func определяют «реальные» возвращаемые типы и всегда имеют хотя бы один параметр универсального типа для возвращаемого типа:

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 добавил in иout модификаторы общих параметров типа для контравариантности и ковариации.См .: Ковариация и Контравариантность в Обобщениях .Примеры:

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)
4 голосов
/ 12 февраля 2012

То, что вы ищете, это Действие.Он не принимает параметров и не возвращает значения.

...