为什么这段代码:
w: word;
s: String;
begin
str(w, s);
在XE7中生成此警告:
[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'
汤姆
答案 0 :(得分:5)
System.Str
是一个内在的功能,可以追溯到一个再见的时代。 documentation说明了这一点:
procedure Str(const X [:Width [:Decimals]]; var S:String);
...
注释:但是,在使用此过程时,编译器可能会发出警告:W1057来自'%s'的隐式字符串。到了'%s' (DELPHI)。
如果不需要具有预定义最小长度的字符串,请尝试使用IntToStr函数。
由于这是一种内在的,因此可能会有额外的事情发生。在幕后,内部函数通过调用RTL支持函数来实现,该函数产生ShortString
。然后编译器魔术将其转换为string
。并警告你隐含的转换。编译器魔术转换
Str(w, s);
到
s := _Str0Long(w);
_Str0Long
的位置:
function _Str0Long(val: Longint): _ShortStr;
begin
Result := _StrLong(val, 0);
end;
由于_Str0Long
返回ShortString
,因此当编译器分配给您的变量ShortString
时,编译器必须生成代码以执行从string
到s
的隐式转换。 }。当然,你看到W1057是很自然的。
底线是Str
仅存在以保持与传统Pascal ShortString
代码的兼容性。新代码不应该调用Str
。您应该执行文档所说的内容并致电IntToStr
:
s := IntToStr(w);
或者也许:
s := w.ToString;