2015-02-02 2 views
0

Я создал общий делегат, и я хочу назначить ему функцию без каких-либо аргументов. Возможно ли это?C# общий делегат, который принимает функцию без аргументов

Вот что я пытался до сих пор:

class Program 
    { 
     public delegate void TemplateDel<T>(T item); 

     public static void fWriteLetters(char[] p_cLetters) 
     { 
      for (int i = 0; i < p_cLetters.Length; i++) 
       Console.WriteLine(p_cLetters[i]); 
     } 
     void fNoArg() 
     { 
      Console.WriteLine("No arguments!"); 
     } 
     static void Main(string[] args) 
     { 
      TemplateDel<char[]> l_dWriteLeters = new TemplateDel<char[]>(fWriteLetters); 
      TemplateDel<void> l_dNoArg    = new TemplateDel<void>(fWriteLetters); 


     } 
    } 

последняя строка кода не компилируется ...

+2

«Не компилируется» подразумевает сообщение об ошибке - что это такое? Кроме того, если последняя строка не будет 'new TemplateDel (fNoArg)' not 'fwriteLetters'? –

+1

http://stackoverflow.com/a/11319003/815938 – kennyzx

+0

В качестве точки стиля: не определяйте для себя собственные типы делегатов. Используйте один из ['Func'] (https://msdn.microsoft.com/en-us/library/bb534960.aspx) или [' Action'] (https://msdn.microsoft.com/en-us /library/018hxwa8%28v=vs.110%29.aspx) делегаты из фреймворка, они уже существуют для 16 параметров. Если вы работаете с обработчиками событий - принимаете (объект, «EventArgs»), то используйте ['EventHandler'] (https://msdn.microsoft.com/en-us/library/system.eventhandler%28v=vs.110% 29.aspx). Поскольку эти хорошо известные читатели вашего кода будут лучше понимать, что вы делаете. – Richard

ответ

5

Нет, это не возможно. void действителен только в обратных типах. Вы не можете использовать его как тип в других контекстах. (кроме контекста unsafe)

Необходимо добавить еще одну перегрузку для своего делегата.

public delegate void TemplateDel(); 

Или просто используйте Action.

1

Как Selman22 заметки в другой answer:

Нет это не представляется возможным.

Но есть еще один способ, с помощью лямбда выбросить аргумент:

TemplateDel<bool> l_dNoArg = new TemplateDel<bool>(_ => fWriteLetters); 

(Использование _ как идентификатор здесь соответствует F # 's подстановочные - игнорировать этот аргумент - синтаксис.)

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

+0

Он не работает ... не скомпилирует: «Только назначение, вызов, приращение, декремент, ожидание и новые объектные выражения могут использоваться как оператор« * И я допустил ошибку, это должно быть fNoArg в последней строке. –

+0

@AmitLipman Эта ошибка - только некоторые вещи действительны как утверждение - могут быть решены только в контексте. Но была опечатка, которая может быть связана. – Richard

Смежные вопросы