#c# #generics
Вопрос:
посмотрел учебник от себастьяна лаге по исправлению пути.и пример кода
public class Heaplt;Tgt; where T : HeapIndexlt;Tgt; { } public interface HeapIndexlt;Tgt; : IComparablelt;Tgt; { int IndexHeap { get; set; } } public class Node : HeapIndexlt;Nodegt; { public int IndexHeap { get; set; } public int CompareTo([AllowNull] Node other) { return IndexHeap.CompareTo(other.IndexHeap); } }
и Heaplt;Nodegt; heapNode = new Heaplt;Nodegt;();
всю свою работу. я начинаю читать для и я в замешательстве. почему я не могу поступить таким образом
public class NodeInt : HeapIndexlt;intgt; { public int IndexHeap { get; set; } public int CompareTo([AllowNull] int other) { return IndexHeap.CompareTo(other); } } NodeInt nd = new NodeInt(); HeapIndexlt;NodeIntgt; hpD = nd as HeapIndexlt;NodeIntgt;; Heaplt;NodeIntgt; heapInt = hpD as Heaplt;NodeIntgt;;
потому что это не работает Heaplt;NodeIntgt; heapNodeInt = new Heaplt;NodeIntgt;();
Я, наверное, просто не до конца понял, и у меня ужасно помутилось в глазах. но я думал, что его код работает, любой экземпляр, отвечающий требованию, где T является реализацией интерфейса, тогда вы можете использовать его для создания кучи , почему я не могу просто Heaplt;NodeIntgt; heapNodeInt = new Heaplt;NodeIntgt;();
Комментарии:
1. Существует ограничение на то, чтобы T было a
HeapIndexlt;Tgt;
.Heaplt;Nodegt;
все в порядке, потомуNode
что реализуетHeapIndexlt;Nodegt;
. Если хотитеHeaplt;NodeIntgt;
, тоNodeInt
должны реализоватьHeapIndexlt;NodeIntgt;
Ответ №1:
Heaplt;Tgt; where T : HeapIndexlt;Tgt;
означает , что если вы хотите Heaplt;NodeIntgt;
, то NodeInt
должны наследовать HeapIndexlt;NodeIntgt;
только потому T = NodeInt
, что в Heap
объявлении. Но ваш NodeInt
есть HeapIndexlt;intgt;
, поэтому он не соответствует требованиям, и этот код не будет компилироваться.
Комментарии:
1. спасибо, что утром меня поняли более четко