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
это функция, а не делегат.
отсюда и ошибка.