实现IComparer - 表达式或assignement中不兼容的数据类型。 (223)

时间:2014-02-28 19:53:19

标签: progress-4gl openedge

我正在尝试在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.

1 个答案:

答案 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.

See this knowledgebase entry for a complete description