Почему компиляция 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 ...", все должно быть хорошо.