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

Meh*_*ide 7 delphi indy

今天我尝试在XE4中编译我的XE3项目.我面临的第一个问题是使用Indy的FTCPClient.Socket.ReadBytes()方法.

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

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

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

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

谢谢.

Rem*_*eau 8

原因TIdBytesTBytes早期的Indy 10版本中的一个简单别名主要是为了兼容SysUtils.TEncoding,使用TBytes.Indy的TIdTextEncoding类型曾经是SysUtils.TEncodingD2009 +中的一个简单别名,所以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,那么你就不会有关于不兼容类型的编译器错误.

  • 发明自己的类型而不是使用等效的RTL类型的库只会导致贫民窟化.我们如何编写使用Indy及其字节数组的代码并使用其字节数组与另一个库进行交互? (5认同)
  • 好的,我相信你有充分的理由改变.我觉得在2013年仍然存在关于如何处理字节数组的争论.假设一切都可以工作的"正确"解决方案将是所有代码直接使用`TArray <T>`,因此享受泛型类型的特殊类型兼容性规则.因此,在理想的世界中,没有"TBytes",没有"TIdBytes",图书馆可以愉快地共存并顺畅地进行交互. (3认同)