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

时间:2012-09-19 10:38:15

标签: 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);

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

online doc说:

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?,但这并未回答此问题。

2 个答案:

答案 0 :(得分:9)

Str(N:W:D,S);   

编译为

S := System._Str2Ext(N, W, D);

其中System._Str2Ext是返回类型为ShortString的函数。它会在string的作业中转换为S。警告虽然不易读,但是正确的,此时存在隐式转换。因此,要么通过避免Str重新编写代码而不进行隐式转换,要么关闭警告,或忽略警告。

答案 1 :(得分:0)

您可以关闭该特定警告。这只是一个提醒,大多数时候你的程序运行正常。我想编译器仍然会在StringShortString内置的函数中看到Str()Writeln()