Это задокументированное поведение функции VarToStr
. Нет необходимости изобретать велосипед.
Нулевой вариант - это отдельный тип (да, это тип, а не просто значение), который обозначает либо отсутствующие, либо неизвестные данные. Таким образом, строго говоря, обычный вариант динамическая типизация не должна происходить со значениями Null
( показано и отражено в значениях по умолчанию RTL).
Дано:
var
V: Variant;
S: string;
лучший код
S := VarToStr(V); { stongly-typed explicit conversion }
относительно хороший код
if not VarIsNull(V) then { program knows what it does, but reproduces RTL behaviour }
S := V
else
S := NullAsStringValue;
плохой код
NullStrictConvert := False; { smelly, from now on Null variant loses its specifics }
S := V;
еще хуже код
try
S := V;
except on Eaten: Exception do { stinky PHP-style, hiding error instead of fixing it }
S := NullAsStringValue;
end;
ПРИМЕЧАНИЕ: Наиболее поздние версии Delphi.NET демонстрируют точно такое же поведение на пустых вариантах, поэтому замечание OP о .NET сомнительно.