请原谅这个愚蠢的问题,但我很困惑。考虑以下方法(对不起,嘈杂的评论,这是一个正在开发的真实代码):
function HLanguages.GetISO639LangName(Index: Integer): string;
const
MaxIso639LangName = 9; { see msdn.microsoft.com/en-us/library/windows/desktop/dd373848 }
var
LCData: array[0..MaxIso639LangName-1] of Char;
Length: Integer;
begin
{ TODO : GetLocaleStr sucks, write proper implementation }
//Result := GetLocaleStr(LocaleID[Index], LOCALE_SISO639LANGNAME, '??');
Length := GetLocaleInfo(LocaleID[Index], LOCALE_SISO639LANGNAME, @LCData, System.Length(LCData));
Win32Check(Length <> 0);
SetString(Result, @LCData, Length); // "E2008 Incompatible types" here, but why?
end;
如果我删除了引用运算符,那么隐式转换 from$X+
就会进行救援并编译方法。为什么编译器使用引用运算符拒绝此代码超出了我的理解。
这是 Delphi XE2,这种行为可能是它特有的。
而且,如果我在此错误范围内添加一个具有等效原型的测试用例虚拟对象作为内在原型,HLanguages.GetISO639LangName
它将神奇地消失:
procedure SetString(var s: string; buffer: PChar; len: Integer);
begin
{ test case dummy }
end;