这与SameText
问题略有不同。
我需要将AnsiString
转换为Integer
。
var
param: AnsiString;
num: Integer;
begin
if TryStrToInt(param, num) then
...
在Unicode之前的Delphi中我会使用TryStrToInt
函数,但在现代Delphi中只有它的Unicode版本,所以我收到了这个警告:W1057从'AnsiString'到'string'的隐式字符串转换随叫随到。
我的问题是,如何在没有编译器警告的情况下正确转换现代Delphi中的AnsiStrings(并且不必过多地将字符串转换为UnicodeString(text))
答案 0 :(得分:7)
您可以使用各种选项:
AnsiString
。 string
:TryStrToInt(string(param), num)
。MultiByteToWideChar
自行执行从ANSI到UTF-16的转换。这不是一个严肃的选择,但如果你想让W1057启用,而不是使用显式转换,那么它就是剩下的。坦率地说,选项1是首选。如果你试图在你的代码中坚持使用AnsiString
,那么你将陷入无休止的演员阵容和警告之中。如果您需要ANSI编码的字符串,则可能处于互操作边界。也许您正在阅读或编写使用ANSI编码的文件。在互操作边界处执行ANSI和UTF-16之间的转换。其余时间,对于您的内部代码,请使用string
。
答案 1 :(得分:0)
如何在现代Delphi中正确转换AnsiStrings而不必获取 编译器警告(并且没有多余的必须将字符串转换为 的UnicodeString
如果你没有从AnsiString转换为String,编译器会为你做。你无法避免演员表演。如果您明确地执行此操作,或者编译器会隐式执行此操作,那么这只是一个问题。
当您在代码中显式执行转换(通过强制转换)时,编译器不会担心副作用。它假设你知道你正在做什么,让你独自一人。
你必须选择一个。编译器警告或显式转换。
您可以从技术上关闭这些编译器警告(但不要这样做):
W1057 IMPLICIT_STRING_CAST ON从'%s'转换为隐式字符串 '%s'(德尔福)
W1058 IMPLICIT_STRING_CAST_LOSS使用隐式字符串转换 潜在数据从'%s'丢失到'%s'(德尔福)