Объясните, пожалуйста, почему не работает такой код?
type
DNode<T> = class
public
/// Поле данных
data: T;
/// Поле связи с предыдущим узлом
prev: DNode<T>;
/// Поле связи со следующим узлом
next: DNode<T>;
/// <summary>
/// Инициализирует новый экземпляр узла двусвязного списка
/// со значением dt поля данных и ссылками prev, next на соседние узлы
/// </summary>
/// <param name="dt">Значение поля данных узла</param>
/// <param name="prev">Сслыка на предыдущий узел</param>
/// <param name="next">Сслыка на следующий узел</param>
constructor(dt: T; prev, next: DNode<T>);
begin
data := dt;
self.prev := prev;
self.next := next;
end;
end;
/// Тип для облегчения работы с двусвязными списками
type
DList<T> = (DNode<T>, DNode<T>);
/// Создание узла двусвязного списка
function MkDNode<T>(dt: T; prev: DNode<T> := nil; next: DNode<T> := nil):= new DNode<T>(dt, prev, next);
/// Создание двусвязного списка по массиву заданных элементов
function CreateDList<T>(params a: array of T): DList<T>;
begin
var firstD: DNode<T> := nil;
if (a = nil) or (a.Length = 0) then
begin
Result := Rec(firstD, firstD);
exit;
end;
firstD := MkDNode(a[0]);
var lastD := firstD;
for var i := 1 to a.Length - 1 do
begin
lastD := MkDNode(a[i], lastD);
lastD.prev.next := lastD;
end;
Result := Rec(firstD, lastD);
end;
begin
Write(CreateDList&<real>.Item1 = nil);
end.
Но всё работает, если вместо одной строчки вывода написать две таких:
var empty := CreateDList&<real>;
Write(empty.Item1 = nil);