Как вы знаете, правильный способ сделать это - написать Myintf := nil
или просто вывести его из области видимости. Вы спрашиваете, почему компилятор принимает FreeAndNil(Myintf)
и не жалуется во время компиляции.
Декларация FreeAndNil
равна
procedure FreeAndNil(var Obj);
Это нетипизированный параметр. Следовательно, он примет все. Вы передали интерфейс, но вы могли передать целое число, строку и т. Д.
Почему дизайнеры выбрали нетипизированный параметр? Ну, им нужно было использовать параметр var
, поскольку цель FreeAndNil
состоит в том, чтобы освободить объект и установить ссылку на объект на nil
. Это невозможно сделать методом целевого объекта, поэтому необходим параметр var
для отдельной функции.
Вы можете себе представить, что можете написать
procedure FreeAndNil(var Obj: TObject);
, поскольку все объекты произошли от TObject
. Но это не делает работу. Причина в том, что объект, который вы передаете параметрам var
, должен быть точно таким же типом этого параметра. Если бы FreeAndNil
было объявлено таким образом, вам пришлось бы приводить к TObject
каждый раз, когда вы его вызывали.
Итак, дизайнеры решили, что лучшее решение проблемы проектирования, наименее плохой выбор, это использовать нетипизированный параметр var.