Делегат: имя метода ожидаемая ошибка - PullRequest
14 голосов
/ 22 февраля 2010

Я пытаюсь заставить работать следующий простой пример делегата. Согласно книге, которую я взял из нее, все должно быть в порядке, но я получаю ошибку Method name expected.

namespace TestConsoleApp
{
    class Program
    {
        private delegate string D();

        static void Main(string[] args)
        {
            int x = 1;

            D code = new D(x.ToString());

        }
    }
}

Любая помощь?

Ответы [ 6 ]

33 голосов
/ 22 февраля 2010

Удалить ():

D code = new D(x.ToString);

Вы хотите указать метод, а не выполнить it.

6 голосов
/ 22 февраля 2010

Я думаю, что вы имеете в виду:

D code = new D(x.ToString);

Обратите внимание на отсутствие скобок. При включенных скобках это был метод invocation - т.е. вы пытались выполнить x.ToString() в этой строке кода. Без скобок это группа методов - выражение, которое указывает компилятору взглянуть на доступные методы с этим именем (в этом контексте) именно для целей создания делегатов.

Какую книгу вы используете? Если в примерах, которые он показывает, действительно есть квадратные скобки, вы можете написать автору (или хотя бы проверить страницу с ошибками в книге). Если это C # в глубине, я пойду и заплачу в углу ...

3 голосов
/ 22 февраля 2010

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

x.ToString()

это не метод, а строка. Используйте

D code = new D(x.ToString); 
0 голосов
/ 22 февраля 2010

Должно быть:

D code = new D(x.ToString);
0 голосов
/ 22 февраля 2010
D code = new D(x.ToString);   // Note the: ()

Вам необходимо указать метод, который будет выполнен в делегате. То, что вы делаете, передает значение вместо подписи функции.

0 голосов
/ 22 февраля 2010

Попробуйте снять скобки с конца метода, вы передаете метод, поэтому вам не нужно использовать скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...