2017-02-14 5 views
-2

В консольном приложении, у меня есть следующий:Почему этот делегат не работает?

static void Main(string[] args) 
{ 
    var t = New Test(); 
    var newString = t.TestDelegate(tester("just testing")); 

    public static string tester(string s) { 
    return s; 
    } 
} 

public delegate string MyDelegate(string s); 

public class Test 
{ 
    public string TestDelegate(MyDelegate m) 
    { 
    return "success!"; 
    } 
} 

Это не работает. На var newString линии, я получаю следующее сообщение об ошибке:

cannot convert from 'string' to 'MyDelegate'

tester имеет ту же сигнатуру, MyDelegate. Что я делаю не так?

+0

Метод 'TestDelegate()' требует экземпляра 'MyDelegate'. Вы передаете ему строку. Если вы хотите передать экземпляр делегата, который ссылается на 'tester', то просто передайте' tester', т. Е. 'Var newString = t.TestDelegate (tester);'. Если это не то, чего вы хотите, тогда я понятия не имею, чего вы хотите. Пожалуйста, исправьте свой вопрос, чтобы он имел смысл. –

+2

Сколько писем в обычном конверте? Один. Сколько писем находится в «обычном конверте»? 18. Функция, которая создает строку и строку, которую она производит, представляет собой две разные вещи. –

ответ

4

Вы не проходя делегат - вы передаете результат tester("just testing") выполнения метода (который является строкой):

t.TestDelegate(tester("just testing")) 

Если вы хотите передать делегат:

t.TestDelegate(tester); 

Также вы не используйте переданный делегат m в вашем методе TestDelegate. Вы можете сделать что-то вроде:

public string TestDelegate(MyDelegate m) 
{ 
    return m("success!"); // m will be your tester method and you call it with success param 
} 

И вы объявляете статический метод внутри другого метода (но я считаю, что это просто копипаст опечатка).

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