Делегат в параметре - PullRequest
1 голос
/ 04 июня 2019

У меня есть несколько методов, которые возвращают список GridTiles, например, GetTopNeighbour. Я хотел бы иметь возможность передавать их в метод AutoConnect, используя в качестве параметра делегат GetNeighboursHandler.

    public delegate List<GridTile> GetNeighboursHandler(GridTile c);

    public List<GridTile> GetTopNeighbour(GridTile c)
    {
        //do stuff and return list
        return null;
    }
     public GridTile AutoConnect(GridTile c, GetNeighboursHandler del)
    {
        List<GridTile> tempList = del(c);

        // do stuff with the tempList
    }

    public void Test(GridTile c)
    {
        AutoConnect(c, GetTopNeighbour(c));
    }

В методе Test я получаю сообщение об ошибке: ... невозможно преобразовать ... Generic.List ... в GetNeighboursHandler. Полностью ли я неправильно понял, как работают делегаты?

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Вам нужно передать delegate (это объект, который знает, как вызвать метод, т. Е. Он содержит ссылку на метод). То, что вы сделали, это передали результат функции, который вы получили после его выполнения GetTopNeighbour(c) возвращает List<GridTile>, и вы передаете это возвращаемое значение в свой код здесь

AutoConnect(c, GetTopNeighbour(c));

Вместо этого вы должны передать ссылку на этот метод GetTopNeighbour

AutoConnect(c, GetTopNeighbour);

См.эти Это учебник и вот еще один

1 голос
/ 04 июня 2019

Вы передаете результат GetTopNeighbour(c), который является List<GridTile>, в качестве параметра для AutoConnect.

Вместо этого вы хотите передать MethodGroup для преобразования в делегат, например, так:

AutoConnect(c, GetTopNeighbour);
1 голос
/ 04 июня 2019

Вы должны передать метод (точнее, группу методов), а не вызывать его:

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