5

我正在将一个旧项目移植到 Delphi XE,并在下面的代码中收到此警告。

function RemoveThousandSeperator(Text: String) : String;
Var P : Integer;
begin
  if length(Text) > 3 then begin
    p := Pos(FormatSettings.ThousandSeparator,Text);
   while p >0 do begin
      Delete(Text,p,1);
      p := Pos(FormatSettings.ThousandSeparator,Text);
    end;
  end;
  result := Text;
end;

甚至 FormatSettings.ThousandSeparator 也是 char 类型。

LE:我在问是否有人可以告诉我为什么会出现这个警告。代码是旧的,它将被重新制作。

LE2:为了得到这个警告,需要在 Delphi Compiler-Hints & Warnings 中将所有警告设置为 true

LE3:如果有人需要它 - {$WARN UNSAFE_CAST OFF} 使警告消失。

LE4:对于那些认为警告难以相信的人的警告截图

在此处输入图像描述

4

1 回答 1

6

警告的起源是FormatSettings变量的声明SysUtils.pas

var
  // Note: Using the global FormatSettings variable corresponds to using the
  // individual global formatting variables and is not thread-safe.
  FormatSettings: TFormatSettings absolute CurrencyString;

它将字符串 ( CurrencyString) 转换为记录 ( TFormatSettings)。

因此,生成警告的问题在于SysUtils.pas,而不是在您发布的代码中,尽管警告是在您的代码中生成的。


这是一个测试用例(Delphi XE):

program Project1;

{$APPTYPE CONSOLE}
{$WARN UNSAFE_CAST ON}

type
  TTest = record
    FS: string;
  end;

var
  Str: string;
  Test: TTest absolute Str;

begin
  Str:= 'abc';
  Writeln(Test.FS);   //  W1048 Unsafe typecast of 'string' to 'TTest'
end.
于 2012-11-01T10:53:51.120 回答