2

考虑:

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”转换为“字符串”

在线文档说:

procedure Str(const X [: Width [:Decimals]]; var S: String);

但是也

注意:但是,在使用此过程时,编译器可能会发出警告:W1057 Implicit string cast from '%s' to '%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));

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

4

2 回答 2

9
Str(N:W:D,S);   

编译为

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

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

于 2012-09-19T11:02:43.023 回答
0

您可以关闭该特定警告。这只是一个提醒,大多数情况下您的程序运行良好。我猜编译器仍然会StringShortString内置的函数中看到Str()Writeln().

于 2012-09-19T10:46:41.823 回答