考虑:
function x_StrZero(N: Double; W: Integer; D: Integer = 0): String;
var S : String;
begin
Str(N:W:D,S);
S := Trim(S);
这使得W1057从'ShortString'到'string'的隐式字符串强制转换
procedure Str(const X [: Width [:Decimals]]; var S: String);
但也
注意:但是,在使用此过程时,编译器可能会发出警告:W1057从'%s'到'%s'(Delphi)的隐式字符串强制转换。
为什么会这样?
我想阻止这种丑陋的解决方法:
function x_StrZero(N: Double; W: Integer; D: Integer = 0): String;
var
S : String;
SS : ShortString;
begin
Str(N:W:D,SS);
S := Trim(String(SS));
我已阅读Why does Delphi warn when assigning ShortString to string?,但这并未回答此问题。
答案 0 :(得分:9)
Str(N:W:D,S);
编译为
S := System._Str2Ext(N, W, D);
其中System._Str2Ext
是返回类型为ShortString
的函数。它会在string
的作业中转换为S
。警告虽然不易读,但是正确的,此时存在隐式转换。因此,要么通过避免Str
重新编写代码而不进行隐式转换,要么关闭警告,或忽略警告。
答案 1 :(得分:0)
您可以关闭该特定警告。这只是一个提醒,大多数时候你的程序运行正常。我想编译器仍然会在String
和ShortString
内置的函数中看到Str()
为Writeln()
。