我正在尝试在Progress 4gl中实现System.Collections.IComparer。
使用以下代码,我收到错误: 表达式或分配中的数据类型不兼容。 (223)
CLASS Tools.Comparer.ItemByItemNo IMPLEMENTS System.Collections.IComparer:
METHOD PUBLIC INTEGER Compare(
INPUT o1 AS System.Object
,INPUT o2 AS System.Object):
/* declaration */
DEFINE VARIABLE oItem1 AS Entity.Item NO-UNDO.
DEFINE VARIABLE oItem2 AS Entity.Item NO-UNDO.
/* cast */
ASSIGN oItem1 = CAST(o1, "Entity.Item").
ASSIGN oItem2 = CAST(o2, "Entity.Item").
/* compare */
RETURN Tools.String:Compare(oItem1:ItemNo, oItem2:ItemNo).
END METHOD.
END CLASS.
是否可以从System.Object强制转换类?
谢谢!的Sebastien
/* Here the code of compare to mimic the .NET compare in progress */
METHOD STATIC PUBLIC INTEGER Compare(
INPUT String1 AS CHARACTER
,INPUT String2 AS CHARACTER):
IF string1 < string2 THEN
RETURN -1.
ELSE IF string1 = string2 THEN
RETURN 0.
ELSE IF string1 > string2 THEN
RETURN 1.
END METHOD.
答案 0 :(得分:3)
来自知识库:
<强>原因强>
这是预期的行为。代码尝试将ABL类分配给类型为System.Object的属性。这是不可能做到的。编译器错误是正确的(不兼容的类型)。所有.NET类都继承自System.Object,而System.Object继承自Progress.Lang.Object,但ABL类不从System.Object继承,即层次结构为:
P.L.O | <user-defined class>
解决方法强>
为了能够将ABL类分配给System.Object,它必须从System.Object继承:
P.L.O | S.O | <.NET classes>
示例代码
USING Progress.Lang.*.
USING System.*.
CLASS a INHERITS Object:
...
END CLASS.