为什么Str()给出"W1057从'ShortString'到'string'的隐式字符串转换"?

Jan*_*gen 2 delphi unicode delphi-xe2

考虑:

function x_StrZero(N: Double; W: Integer; D: Integer = 0): String;
var S : String;
begin
  Str(N:W:D,S);   
  S := Trim(S);
Run Code Online (Sandbox Code Playgroud)

这使得W1057从'ShortString'到'string'的隐式字符串强制转换

在线文档说:

procedure Str(const X [: Width [:Decimals]]; var S: String);
Run Code Online (Sandbox Code Playgroud)

但是也

注意:但是,在使用此过程时,编译器可能会发出警告: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));
Run Code Online (Sandbox Code Playgroud)

我已经阅读了为什么在将ShortString分配给字符串时Delphi会发出警告?但这并不能解决这个问题.

小智 9

Str(N:W:D,S);   
Run Code Online (Sandbox Code Playgroud)

被编译为

S := System._Str2Ext(N, W, D);
Run Code Online (Sandbox Code Playgroud)

where System._Str2Ext是一个返回类型为的函数ShortString.它将转换为string赋值给S.警告虽然不易读,但是正确的,此时存在隐式转换.因此,要么通过避免Str或者关闭警告或忽略警告来重新编写代码以使其无法进行隐式转换.