为什么 X++ 编译失败,因为缺少所谓的可选参数取决于我最后保存的类?

问题描述

我有两个班级:

[DataContractAttribute,SysOperationContractProcessingAttribute(classstr(CustBalanceUIBuilder)),SysOperationGroupAttribute('Date',"@ApplicationPlatform:SingleSpace",'1')]
public class CustBalanceDataContract implements SysOperationValidatable
{
    NoYesId     allowModifyDate;
    TransDate   transDate;
    str packedQuery;
 
    [DataMemberAttribute('DateTransactionDate'),SysOperationLabelAttribute(literalStr("@SYS11284")),SysOperationGroupMemberAttribute('Date'),SysOperationdisplayOrderAttribute('1')]
    public TransDate parmTransDate(TransDate _transDate = transDate)
    {
        transDate = _transDate;
        return transDate;
    }

    [DataMemberAttribute('DateControl'),SysOperationLabelAttribute("Enable date control"),SysOperationdisplayOrderAttribute('0')]
    public NoYesId parmAllowModifyDate(NoYesId _allowModifyDate = allowModifyDate)
    {
        allowModifyDate = _allowModifyDate;
        return allowModifyDate;
    }

    public boolean validate()
    {
        boolean ret = true;
        if(!transDate && allowModifyDate)
        {
            ret = checkFailed('Transaction date cannot be empty');
        }
        return ret;
    }

    [DataMemberAttribute,aifQueryTypeAttribute('_packedQuery',querystr(CustTableSRS))]
    public str parmQuery(str _packedQuery = packedQuery)
    {
        packedQuery = _packedQuery;
        return packedQuery;
    }

    public Query getQuery()
    {
        return new Query(SysOperationHelper::base64Decode(packedQuery));
    }

    public void setQuery(Query _query)
    {
        packedQuery =SysOperationHelper::base64Encode(_query.pack());
    }

}

public class CustBalanceService
{
    public void processData(CustBalanceDataContract _custBalanceDataContract)
    {
        QueryRun queryRun = new queryRun(_custBalanceDataContract.getQuery());
        while(queryRun.next())
        {
            CustTable custTable = queryRun.get(tableNum(custTable));
 
            TransDate transDate = _custBalanceDataContract.parmTransDate();
            Amount balance = (transDate)
                ? custTable.balanceMST(dateNull(),transDate)
                : custTable.balanceMST();

            info(strFmt('%1 - %2',custTable.AccountNum,balance));
        }
    }
}

当它成功编译时,它的行为符合预期。

但是,如果我保存 CustBalanceDataContract解决方案会重新编译,然后告诉我 CustBalanceService 中存在错误,因为 _custBalanceDataContract.parmTransDate(); 缺少参数 1,您可以从签名 { {1}} 应该是一个可选参数。

但是如果我什么都不做并再次保存 public TransDate parmTransDate(TransDate _transDate = transDate),编译就会如预期的那样。

这是编译器中的错误吗?这是一个已知问题吗?有没有办法解决这个问题? 代码是否真的有问题,即使在成功编译和执行后也可能导致失败?

解决方法

我可以重现这个问题。

看来您有在 中发现那些小特质的诀窍。要回答您的问题,是的,这可能是编译器中的问题。正如我在对您的其他问题之一的评论中所说的那样, 从它不属于 .NET 语言家族的那一刻起就有了一些遗留的包袱。一般来说,我认为在保存单个对象甚至整个项目/解决方案的编译过程中进行编译更佳。根据我的经验,唯一能够可靠运行并产生有用结果的编译是完整包/模型的编译(在 Visual Studio 中,它是由 Dynamics 365 > 构建模型...菜单调用​​的)。

我认为您描述的问题不是已知问题。至少我不知道它,我不知道修复它。不,我不认为代码有问题。如果它通过“Build models...”编译成功编译,应该没问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...