Почему компиляция 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"), SysOperationGroupMemberAttribute('Date'), 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, решение перекомпилируется, а затем сообщает мне об ошибке, потому что _custBalanceDataContract.parmTransDate(); отсутствует аргумент 1, что видно из подписи public TransDate parmTransDate(TransDate _transDate = transDate) должен быть необязательным аргументом.

Но тогда, если я ничего не изменю и сохраню CustBalanceService опять же, компиляция такая, как ожидалось.

Это ошибка компилятора? Это известная проблема? можно ли это исправить? Что-то действительно не так с кодом, что может вызвать сбои даже после его успешной компиляции и выполнения?

1 ответ

Я могу воспроизвести проблему.

Похоже, вы умеете находить эти маленькие особенности в . Чтобы ответить на ваши вопросы, да, это может быть проблема в компиляторе. Как я сказал в комментарии к одному из ваших вопросов, x++x++ имеет некоторый багаж наследия тех времен, когда он не был частью семейства языков .NET. В общем, я считаю, что компиляция во время сохранения отдельного объекта или даже компиляция всего проекта / решения более удобна. Единственная компиляция, которая, по моему опыту, работает надежно и дает полезный результат, - это компиляция полного пакета / модели (в Visual Studio она вызывается из меню Dynamics 365> Построить модели ...).

Я не думаю, что описанная вами проблема является известной. По крайней мере, я не знал об этом и не знаю, как это исправить. И нет, я не думаю, что с кодом что-то не так. Если он успешно компилируется с компиляцией "Build models ...", все должно быть хорошо.

Другие вопросы по тегам