C# - ошибка CS0123 Метод или параметры делегата не соответствуют параметру делегата

Я застрял в ошибке, которую я могу понять, но не могу исправить, это ошибка CS0123, когда параметры между методом и делегатом не совпадают. Но я посмотрел на мой код, и он кажется правильным, поэтому я запутался и прошу вашей помощи, так как я изучаю более продвинутый C# с этим проектом. Этот проект собирается создать шестнадцатеричную сетку, а затем обработать на ней путь A* между двумя шестнадцатеричными плитками. Я использовал эту серию письменных руководств, даже если это старая версия, и мне пришлось немного обновить код, чтобы она работала на Unity 5 и более поздних версиях C# .NET (я полагаю).

Вот ошибки:

Assets / Scripts / GridManager.cs (151,39): ошибка CS0123: метод или делегат "GridManager.calcDistance(Tile)" не соответствуют параметрам делегата "System.Func()"

Assets/Scripts/GridManager.cs(153,17): ошибка CS1502: лучшее совпадение перегруженного метода для 'GridManager.DrawPath(System.Collections.Generic.IEnumerable)' имеет недопустимые аргументы

Assets/Scripts/GridManager.cs(153,17): ошибка CS1503: Аргумент '#1' не может преобразовать выражение 'объекта' в тип 'System.Collections.Generic.IEnumerable'

Я почти уверен, что эти два параметра существуют только из-за первого, потому что он не распознает правильный тип var, который должен быть плиткой.

Я надеюсь, что вы сможете мне помочь и объяснить, что я сделал не так. Я думаю, что я не совсем то, что там происходит.

Заранее спасибо!

Вот часть моего модифицированного кода, но он в основном такой же, как и учебник:

GridManager.cs:

    double calcDistance(Tile tile)
    {
            Tile destTile = destTileTB.tile;
            float deltaX = Mathf.Abs(destTile.X - tile.X);
            float deltaY = Mathf.Abs(destTile.Y - tile.Y);
            int z1 = -(tile.X + tile.Y);
            int z2 = -(destTile.X + destTile.Y);
            float deltaZ = Mathf.Abs(z2 - z1);

            return Mathf.Max(deltaX, deltaY, deltaZ);
    }

    private void DrawPath(IEnumerable<Tile> path)
    {
            if (this.path == null)
                    this.path = new List<GameObject>();
            this.path.ForEach(Destroy);
            this.path.Clear();

            GameObject lines = GameObject.Find("Lines");
            if (lines == null)
                    lines = new GameObject("Lines");
            foreach (Tile tile in path)
            {
                    var line = (GameObject)Instantiate(Line);
                    Vector2 gridPos = new Vector2(tile.X + tile.Y / 2, tile.Y);
                    line.transform.position = calcWorldCoord(gridPos);
                    this.path.Add(line);
                    line.transform.parent = lines.transform;
            }
    }

    public void generateAndShowPath()
    {
            if (originTileTB == null || destTileTB == null)
            {
                    DrawPath(new List<Tile>());
                    return;
            }
            Func<Tile, Tile, double> distance = (node1, node2) => 1;

            var path = PathFinder.FindPath(originTileTB.tile, destTileTB.tile,
                                           distance, calcDistance); //error is here
            DrawPath(path);
    }

PathFinder.cs:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    public static class PathFinder
    {
    public static Path<Node> FindPath<Node>(
            Node start,
            Node destination,
            Func<Node, Node, double> distance,
            Func<Node> estimate)
            where Node : IHasNeighbours<Tile>
    {
            var closed = new HashSet<Node>();
            var queue = new PriorityQueue<double, Path<Node>>();
            queue.Enqueue(0, new Path<Node>(start));

            while (!queue.IsEmpty)
            {
                    var path = queue.Dequeue();

                    if (closed.Contains(path.LastStep))
                            continue;
                    if (path.LastStep.Equals(destination))
                            return path;

                    closed.Add(path.LastStep);

                    foreach (Node n in path.LastStep.Neighbours)
                    {
                            double d = distance(path.LastStep, n);
                            var newPath = path.AddStep(n, d);
                            queue.Enqueue(newPath.TotalCost + estimate(n), newPath);
                    }
            }

            return null;
    }
    }

2 ответа

Решение

В методе FindPath вы определяете оценку как Func, который не принимает аргументов и возвращает узел, но при вызове метода, который вы передаете в calcDistance, который принимает плитку и возвращает значение double. Похоже, оценка должна быть Func, который принимает Node и возвращает double.

public static Path<Node> FindPath<Node>(
        Node start,
        Node destination,
        Func<Node, Node, double> distance,
        Func<Node, double> estimate)

var path = PathFinder.FindPath(originTileTB.tile, destTileTB.tile, distance, calcDistance); // ошибка здесь

ну, кажется, есть много ошибок, именно ошибка, когда вы пытаетесь пройти calcDistance и если вы видите ожидаемый вклад, это Func<node> estimate это означает, что он ищет делегата, который возвращает тип Node, Ясно ваш calcDistance это функция, а не делегат.

отсюда и ошибка.

Другие вопросы по тегам