Delphi:处理字符串不是对象的事实
我正在尝试编写一个函数,它接受任何TList并返回TList的所有元素的String表示.
我试过这样的功能 function ListToString(list:TList<TObject>):String; 这很好,除了你不能传递TList< String>它. E2010 Incompatible types: 'TList<System.TObject>' and 'TList<System.string>' 在Delphi中,String不是Object.为了解决这个问题,我写了第二个函数: function StringListToString(list:TList<string>):String; 这是唯一的解决方案吗?还有其他方法可以将String视为更像“对象”吗? 同样,我也想写一个’equals’函数来比较两个TList.我再次陷入同样的??问题 function AreListsEqual(list1:TList<TObject>; list2:TList<TObject>):boolean; 有没有办法编写这个函数(也许使用泛型?)所以它也可以处理TList< String>?在尝试创建处理字符串和对象的代码时,是否还有其他技巧或“最佳实践”?或者我只创建每个函数的两个版本?仿制药可以帮助吗? 我来自Java背景,但现在在Delphi工作.看起来他们最近在Java世界中向Delphi添加了很多东西(或者也许是从Java复制它们的C#世界).就像向TObject添加equals()和hashcode(),以及创建一个通用的Collections框架等.我想知道如果你不能使用Strings这些添加是否非常实用. [编辑:有人提到过TStringList.到目前为止我已经习惯了,但是我在问TList.我正在努力研究如果使用TList的一切(包括字符串)是一种更清洁的方式.] 解决方法
你的问题不是那个字符串和TObject是不兼容的类型,(虽然它们是,)它是TList< x>和TList< y>是不兼容的类型,即使x和y本身不是.原因很复杂,但基本上就是这样.
想象一下,你的函数接受了TList< TObject>,你传入了TList< TMyObject>它起作用了.但是在您的函数中,您将TIncompatibleObject添加到列表中.由于函数签名只知道它正在使用TObjects列表,然后就可以了,突然你违反了一个不变量,当你试图枚举该列表并在里面使用TMyObject实例时,某些东西可能会爆炸. 如果Delphi团队增加了对泛型类型的协方差和逆变的支持,那么你就能安全地做这样的事情,但不幸的是他们还没有解决它.希望我们很快就会看到它. 但是要回到原来的问题,如果你想比较一个字符串列表,就不需要使用泛型; Delphi有一个名为TStringList的特定字符串列表类,可以在Classes单元中找到,您可以使用它.它有很多用于字符串处理的内置功能,包括将所有字符串连接成单个字符串的三种方法:Text,CommaText和DelimitedText属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |