Uli*_*rdt 29
尝试将NullStrictConvert设置为False.
因为它是一个全局变量,我使用它如下,以尽量减少副作用:
var
OldNullStrictConvert: Boolean;
begin
OldNullStrictConvert := NullStrictConvert;
NullStrictConvert := False;
try
// code containing conversions
finally
NullStrictConvert := OldNullStrictConvert;
end;
end;
Run Code Online (Sandbox Code Playgroud)
(实际上,我已经制作了一个监护人界面.)
注意:在可行的情况下,我更喜欢沃伦的代码.
War*_* P 18
接受的答案会更改全局设置,并且可能会在更改之前对其他代码的操作产生意外的副作用.
首先,你可以使用VarToStrDef
,其次,如果你必须提供除此之外的一些功能,那么我会让我的代码调用我自己的函数MyVarToStr,并像这样做:
resourcestring
SNilValue = '[nil]';
function VarIsAssigned(v:Variant):Boolean; inline;
begin
result := (v<>Variants.Null) and (not VarIsNull(V));
end;
function MyVarToStr( v:Variant):String;
begin
if VarIsAssigned(v) then
result := VarToStr(v)
else
result := SNilValue;
end;
Run Code Online (Sandbox Code Playgroud)
因为它似乎VarToStrDef应该够了,我只意味着,以证明这是更好地编写代码,并呼吁自己的代码,而不是试图"全球变化"的VCL/RTL代码库的默认行为.
use*_*039 14
这是记录的VarToStr
函数行为.没有必要重新发明轮子.
空变量是不同类型(是的,它是一种类型,而不仅仅是一个值),表示缺失或未知数据.因此,严格来说,常规变量动态类型不应该与Null
值一起发生(在RTL默认值中说明和反映).
var
V: Variant;
S: string;
Run Code Online (Sandbox Code Playgroud)
S := VarToStr(V); { stongly-typed explicit conversion }
Run Code Online (Sandbox Code Playgroud)
if not VarIsNull(V) then { program knows what it does, but reproduces RTL behaviour }
S := V
else
S := NullAsStringValue;
Run Code Online (Sandbox Code Playgroud)
NullStrictConvert := False; { smelly, from now on Null variant loses its specifics }
S := V;
Run Code Online (Sandbox Code Playgroud)
try
S := V;
except on Eaten: Exception do { stinky PHP-style, hiding error instead of fixing it }
S := NullAsStringValue;
end;
Run Code Online (Sandbox Code Playgroud)
注意:大多数后期Delphi.NET在Null变体上表现出完全相同的行为,因此OP对.NET的评论是值得怀疑的.