TBytes和TidBytes之间的Delphi XE4 Indy兼容性问题

前端之家收集整理的这篇文章主要介绍了TBytes和TidBytes之间的Delphi XE4 Indy兼容性问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我尝试在XE4中编译我的XE3项目.我面临的第一个问题是使用Indy的FTCPClient.Socket.ReadBytes()方法.

在它接受TBytes类型之前,现在它坚持使用TidBytes.

定义:
TIdBytes =字节数组;
TBytes,我不确定我猜它是泛型类似于TArray的字节数组.

问题1:
为什么编译器抱怨说'[dcc32 Error] HistoricalStockData.pas(298):E2033实际和正式var参数的类型必须相同’.我认为它们已经相同了.

问题2:
我应该用每个新的delphi版本修改我的源代码吗?

谢谢.

解决方法

TIdBytes是早期Indy 10版本中TBytes的简单别名的原因主要是为了与使用TBytes的SysUtils.TEncoding兼容. Indy的TIdTextEncoding类型曾经是D2009中SysUtils.TEncoding的简单别名,因此TIdBytes必须是TBytes匹配的简单别名.

然而,TBytes在XE3中给Indy造成了相当大的麻烦,主要是因为Generics的RTTI问题(在最近的Delphi版本中,TBytes是TArray< Byte>的简单别名).因此,Indy 10.6重新设计了TIdTextEncoding,完全不再依赖于SysUtils.TEncoding(还有其他原因),这样就可以让TIdBytes更改为自己的数组类型,以避免XE3问题向前发展.

另一方面,你传递的是TBytes,其中TIdBytes是预期的,所以这是因为你首先没有遵循Indy定义的接口而编程错误.所有Indy 10的基于字节的操作(包括ReadBytes())始终仅在TIdBytes上运行. TIdBytes静默映射到TBytes的事实是一个实现细节,您不应该依赖于您的代码. Indy 10需要TIdBytes,所以使用TIdBytes,那么就不会有关于不兼容类型的编译器错误.

猜你在找的Delphi相关文章