Так что мне нужно было реализовать поиск с использованием вершин и ребер, которые уже вычисляются в другой части кода (я рассматриваю эту часть как черный ящик).Параметрирование общего интерфейса в объявлении класса
Так у меня есть свой график, со списком вершин и ребер:
class Graph {
List<Vertex> vertices;
List<Edge> edges;
}
Я решил сделать общую реализацию для поиска, и создали оболочку для вершин:
class Node<T> {...}
и создал интерфейс для краев, так что я могу использовать их в поиске:
interface ISearchLink<T> {...}
в результате заголовок метод поиска выглядит следующим образом:
public static List<Node<T>> Search(List<Node<T>> nodes, List<ISearchLink<T>> links);
сейчас, потому что края уже используют тип я хотел их, и держать его consitent с другой стороны, я изменил класс Грань заявление выглядеть следующим образом (и реализованы методы интерфейса):
class Edge : ISearchLink<Vertex> {...}
так что теперь, когда я звоню поиска, он говорит, что я недопустимые аргументы
List<Node<T>> table = search(vertices, edges);
, который, кажется, указывает что объявление Edge недействительно (хотя у меня нет жалоб от VS). Является ли это заявление недействительным, и если да, то почему нет ошибки? И если это не является недопустимым, то какая проблема? (Кажется, VS не может преобразовать список «Грань» в список «ISearchLink«Vertex»»)
редактирования: ошибки в конкретных являются:
The best overloaded method match for Node<Vertex>.search(System.Collections.Generic.List<Vertex>, System.Collections.Generic.List<ISearchLink<Vertex>>)' has some invalid arguments
и
cannot convert from 'System.Collections.Generic.List<Edge>' to 'System.Collections.Generic.List<ISearchLink<Vertex>>'
«Недопустимые аргументы» часто является ошибкой во время выполнения, но если вы имеете дело с параметрами типа, это может быть ошибка времени компиляции. Можете ли вы указать точную ошибку, которую вы получаете в своем вопросе? –
Должен ли ваш список узлов (и список краев) иметь тип List в определенном? Или можно искать в IEnumerables вместо этого? Я спрашиваю, потому что IEnumerable ковариантен в своем параметре типа, а List инвариантен, и вы, похоже, ожидаете ковариантного поведения. –
@JerryFederspiel это может быть IEnumerable, я просто закончил использование List (потому что я не думал, что так оно делает) – MasterOfTwo