AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.08.2015, 15:54   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ax2012. Типы операндов не совместимы с оператором
Использование функций при вычислении значений тринарных операторов в Ax2012 R3 в процессе компиляции выдает предупреждение:

Типы операндов не совместимы с оператором

Как это можно вылечить, оставаясь в рамках тринарных операторов?

X++:
static void test(Args _args)
{
    Qty qty;
    Qty qty2;
    ;

    qty = true ? qty2 : 0.0;                 // Нет предупреждений
    qty = true ? min(qty2,qty) : 0.0;   // предупреждение
    qty = true ? 0.0 : min(qty2,qty);   // предупреждение
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.08.2015, 16:12   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Не пробовал, но как насчет "any2real(min(qty2,qty)"?
За это сообщение автора поблагодарили: Владимир Максимов (5).
Старый 05.08.2015, 16:17   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вот ведь... Действительно, приведение типов у функции min() помогло. Спасибо...
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.08.2015, 16:45   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А как быть в случае табличных переменных и map? any2record() вроде бы нет?

X++:
CustVendTable = true ? VendTable::find(...) : CustTable::find(...);
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 05.08.2015, 17:48   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
На последний вопрос сам спросил - сам ответил Нужно использовать метод data() соответствующей табличной переменной или MAP.

X++:
CustVendTable = true ? CustVendTable.data(VendTable::find(...)) : CustVendTable.data(CustTable::find(...));
X++:
// перебор записей в DataSource формы
    for (lookupJournalTable = (dataSource && dataSource.getFirst(1) ? journalTable.data(dataSource.getFirst(1)) : journalTable);
         lookupJournalTable;
         lookupJournalTable = (dataSource ? dataSource.getNext() : null))
{
...
}

Тут следует заметить, что явное преобразование типов требуется только в том случае, если вычисляемые типы тринарного оператора имеют разное значение. Например, вот такой код будет откомпилирован без ошибок.

X++:
CustVendTable = true ? VendTable::find(...) : VendTable::find(...);
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Ruff (2), S.Kuskov (2).
Старый 20.12.2020, 22:08   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
up-ну тему.

Стали причесывать код. Там где раньше все нормально было, на тернарных операторах стало выдавать "operand types are not compatible with the operator" или "Типы операндов не совместимы с оператором."

Достает.
Можно как-то это убрать ?

Погуглил
Преобразование System.String в str
https://community.dynamics.com/ax/f/...patible/577041
https://community2.dynamics-int.com/...tor-in-ax-2012
http://www.javaear.com/question/28894455.html

Ясности не добавило.

Мне кажется это явно какой-то баг компилятора.
Так как аналогичный код написаный через if и оператор присваивания работает хорошо и ругани нет.

Для примера вот такой код из реального проекта

X++:
public static boolean validateField_MRC(Common _record, FieldId _fieldId, boolean _ignoreDataSourceLevel = false)
{
    DictField       dictField;
    FormDataSource  fds;
    FormDataObject  fdo;
    str             testStr;
    container       con;
    
    boolean ret;
    ;

    dictField = new DictField(_record.TableId, _fieldId);

    fds = null; // не ругается
    
    fds = !_ignoreDataSourceLevel ? (SysDictClass::as(_record.dataSource(), classNum(FormObjectSet))) : null; // не ругается
    fds = !_ignoreDataSourceLevel ? (SysDictClass::as(_record.dataSource(), classNum(Object))) : null; // не ругается
    
    fds = !_ignoreDataSourceLevel ? _record.dataSource() : null; // ругается
    fdo = fds ? fds.object(_fieldId) : null;

    ret = !(dictField.mandatory() || (fdo && fdo.mandatory())) || validateFieldIsSet_MRC(_record, _fieldId);
    if (ret)
    {
        ret = fdo ? fdo.validate() : _record.validateField(_fieldId); // ругается - один boolean отличается от другого ?
        ret = fdo ? fdo.validate() : any2int(_record.validateField(_fieldId)); // не ругается
        ret = fdo ? fdo.validate() : any2enum(_record.validateField(_fieldId)); // не ругается
        
        ret = fdo.validate(); // не ругается
        ret = _record.validateField(_fieldId); // не ругается
    }

    testStr = conPeek(con, 1) ? conPeek(con, 2) : @""; // ругается
    testStr = conPeek(con, 2);  // не ругается
    testStr = @"";   // не ругается
    
    return ret;
}
1. Как можно это обойти ? Неужели везде дописывать any2XXX(..) ?
2. Какие идеи почему так сделано ?

Мне пока кажется что это из-за проблем с маршаллингом X++ <---> CIL

Самый простой способ, какой нашел - юзать any2XXX() функции - так читаемость кода страдает меньше всего. Либо переделывать на if else c явным присваиванием.
Для случая классов и таблиц можно написать в Global свои методы any2Object_MRC() и any2Common_MRC(). Можно также задействовать SysDictClass::as()

X++:
// см. также Global::asObject()
static public Object any2Object_MRC(anytype _parm)
{
    Object      ret;
    ;

    switch (typeOf(_parm))
    {
        case Types::Class:
            // info("         any2Object_MRC:Class");
            return _parm;
            // break;
            
        case 44: // typeOf(null)
            // info("         any2Object_MRC:null of Class");
            return _parm;
            // break;
            
        case Types::AnyType: // такое бывает когда дефолтное значение anyType приходит в CIL
            // info("         any2Object_MRC:anyType");
            return _parm;
            // break;
            
        default:
            // info("         any2Object_MRC:other");
    }

    return ret;
}
X++:
// см. также Global::asCommon() 
// и SysDictTable::as()
// 
static public Common any2Common_MRC(anyType _parm)
{
    ;

    return _parm;
}
но они нормально работают только для ненулевых ссылок. Особенно в CIL.

Последний раз редактировалось Logger; 20.12.2020 в 22:19.
Старый 20.12.2020, 22:26   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Добавлю еще 3-й вопрос.
почему такой код
X++:
fds = !_ignoreDataSourceLevel ? _record.dataSource() : null; // ругается
вызывает проблемы. Разве null нельзя однозначно преобразовать в нулевую ссылку на класс, как это происходит при обычном присваивании переменной
X++:
fds = null; // не ругается
А вот это еще веселее
X++:
ret = fdo ? fdo.validate() : _record.validateField(_fieldId); // ругается - один boolean отличается от другого ?
оба метода (FormDataObject.validate и common.validateField) возвращают boolean, но компилятор увидел где-то отличия в типах

а вот так нормально
X++:
        ret = fdo ? fdo.validate() : any2int(_record.validateField(_fieldId)); // не ругается
        ret = fdo ? fdo.validate() : any2enum(_record.validateField(_fieldId)); // не ругается
видимо где то в ядре прописано что один из методов валидации возвращает int, а другой boolean в то время как во всплывающей подсказке для обоих методов стоит описание, что возвращается boolean. Другого объяснения у меня нет.

Последний раз редактировалось Logger; 20.12.2020 в 22:50.
Старый 20.12.2020, 22:31   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
4-й вопрос. - Кто как обходит такое поведение компилятора?
пока вижу такие способы
а. Отказаться от тернарного оператора в случае когда выдает ругань.
б. Использовать any2XXX функции, дописав недостающие самим в global классе. Есть ли в этом какой то риск в случае CIL ?
в. Забить на предупреждения компилятора (а как их тогда подавить корректно ? Грубые хаки в виде кода на insert / write методах таблицы TmpCompilerOutput c запретом вставки записи - я не считаю. Это крайний вариант)
г. ...

5-й вопрос - как с этим обстоит дело в 365-й ?

Последний раз редактировалось Logger; 20.12.2020 в 22:51.
Старый 20.12.2020, 22:39   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
На последний вопрос сам спросил - сам ответил Нужно использовать метод data() соответствующей табличной переменной или MAP.
Я не пробовал но боюсь не всегда прокатит.
Так как при таком способе
1. теряется курсор к БД, а он бывает нужен.
2. теряется orig значение буфера.
3. buffer.data() глючно возвращает дубликат если buffer наследуемая табличка - не все поля заполняет. Возможно и при передаче буфера по ссылке внутрь вызова Data() тоже может быть фигня.
см. тему Приведение типов для таблиц ax2012
(там описана проблема для orig() но у data() те же проблемы)

в общем мне кажется что метод any2common_MRC() безопаснее и удобнее. Если нужно тип явно сохранить то можно задействовать SysDictTable::as вместо global::any2common_MRC
Приведение типов для таблиц ax2012

Последний раз редактировалось Logger; 20.12.2020 в 22:48.
Старый 21.12.2020, 04:18   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Стали причесывать код. Там где раньше все нормально было, на тернарных операторах стало выдавать "operand types are not compatible with the operator" или "Типы операндов не совместимы с оператором."

Достает.
Можно как-то это убрать ?

Погуглил
гуглить в сторону "ковариантность" и "инвариантность".
https://ru.wikipedia.org/wiki/%D0%9A...D%D0%B8%D0%B5)

в java изначально типы ковариантны. и дополнительно было очень много послаблений в примитивных типах.
в аксапте изначально добавили ковариантность в методы классов. что позволяло до ax2009 указывать производные типы методах классов наследников (уж не знаю по недосмотру или был какой замысел).

в ax2012 с какого-то перепуга разработчики сделали типы инвариантными как в C# 2.0. причем очень жестко.
из-за этого нельзя уточнять тип в параметрах методов и в возвращаемых значениях.

в качестве побочного эффекта получили вот такие затыки в тренарных операторах, а также в map (который AOT).

именно из-за этого лично я считаю ax2012 худшей аксаптой изо всех сделанных.

были слухи, что в ax2012 делали перегрузку методов и генерики.
но ни перегрузки, ни генериков в аксапту так и не завезли.
осталась только возможность писать в коде генерик типы .net (аксаптовские типа в таких конструкциях писать нельзя)
System.Array<System.Object> arr;

но зато в ax2012 ввели оператор языка is и as.

в d365fo, насколько я помню, типы снова стали ковариантными.
после того, как в C# 4.0+ добавили ковариантность для генериков


Цитата:
Сообщение от Logger Посмотреть сообщение
Мне кажется это явно какой-то баг компилятора.
это фича.

Цитата:
Сообщение от Logger Посмотреть сообщение
Так как аналогичный код написаный через if и оператор присваивания работает хорошо и ругани нет.
Синтаксически:
if - это инструкция (statement), которая состоит из нескольких выражений
тренарный - это одно выражение (expression)


Цитата:
Сообщение от Logger Посмотреть сообщение
2. Какие идеи почему так сделано ?
сделано "как в c#" людьми, которые кроме c# ничего не знают.

Цитата:
Сообщение от Logger Посмотреть сообщение
Мне пока кажется что это из-за проблем с маршаллингом X++ <---> CIL
если сформулировать утверждение полностью, то сразу станет понятно.
достаточно дописать версию
"из-за проблем с маршаллингом X++ <---> .net 3.5-"

Цитата:
Сообщение от Logger Посмотреть сообщение
Для случая классов и таблиц можно написать в Global свои методы any2Object_MRC() и any2Common_MRC(). Можно также задействовать SysDictClass::as()
Только не в global! Расширь класс any!
и не надо использовать эти угрёбищные суффиксы! пожалуйста.


Цитата:
Сообщение от Logger Посмотреть сообщение
б. Использовать any2XXX функции, дописав недостающие самим в global классе.
только не в Global
Христа ради!


Цитата:
Сообщение от Logger Посмотреть сообщение
Я не пробовал но боюсь не всегда прокатит.
Так как при таком способе
1. теряется курсор к БД, а он бывает нужен.
2. теряется orig значение буфера.
3. buffer.data() глючно возвращает дубликат если buffer наследуемая табличка - не все поля заполняет.
угу-угу.
4. странные и мигающие глюки с map'ами


Цитата:
Сообщение от Logger Посмотреть сообщение
вместо global::any2common_MRC
Господи! Только не в global... там и так уже насрато...
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 21.12.2020 в 04:54.
За это сообщение автора поблагодарили: Logger (5).
Старый 21.12.2020, 08:30   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Спасибо. Интересно.
Но у меня вопрос практический.
Как правильнее подавить предупреждения компилятора.
Какие при этом риски. Не вылезет ли что нить притисполнении под cil.

На первый взгляд, сюрпризов не должно быть. Функции any2xxx должны решить вопрос.
Старый 21.12.2020, 08:48   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
На первый взгляд, сюрпризов не должно быть. Функции any2xxx должны решить вопрос.
Не должно быть.

только методы Any::toXXX() пожалуйста.
__________________
полезное на axForum, github, vk, coub.
Старый 23.12.2020, 14:34   #13  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от mazzy Посмотреть сообщение
осталась только возможность писать в коде генерик типы .net (аксаптовские типа в таких конструкциях писать нельзя)
System.Array<System.Object> arr;
Это в какой версии Ax2012 такая фантастика появилась ?
Я даже в .net framework не нашёл такую generic-конструкцию для System.Array
__________________
Дмитрий
Старый 23.12.2020, 16:58   #14  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Damn Посмотреть сообщение
Это в какой версии Ax2012 такая фантастика появилась ?
Кстати, да. Я считал, что в 2012 нужно извращаться через рефлексию а-ля подобному OXML_RU::invokeGeneric или тому, что в SrsProxy.
Что-то появилось более простое?
За это сообщение автора поблагодарили: Logger (3).
Старый 23.12.2020, 23:09   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
гуглить в сторону "ковариантность" и "инвариантность".
Гуглим:

Ковариа́нтность и контравариа́нтность[1] в программировании — способы переноса наследования типов на производные[2] от них типы — контейнеры, обобщённые типы, делегаты и т. п. Термины произошли от аналогичных понятий теории категорий «ковариантный» и «контравариантный функтор».


Цитата:
Сообщение от mazzy Посмотреть сообщение
в java изначально типы ковариантны. и дополнительно было очень много послаблений в примитивных типах.
Это вообще про что? В джаве изначально не было дженериков как и в X++ и в С# какие именно типы были ковариантны?

Цитата:
Сообщение от mazzy Посмотреть сообщение
в аксапте изначально добавили ковариантность в методы классов. что позволяло до ax2009 указывать производные типы методах классов наследников (уж не знаю по недосмотру или был какой замысел).
Это я тоже не понял. При чем тут ковариантность? Имеется ввиду covariant return types?

Вот хочется проверить. У кого под руками есть 2012, можете проверить, что поддерживается именно ковариантность а не произвольное переопределение. Т.е. что контроллируется что метод производного класса обязан возвращать именно подкласс результата переопределенного метода, а не вообще все, что угодно, лишь бы оно было классом (назовем это пофиг-вариантностью)

Цитата:
в ax2012 с какого-то перепуга разработчики сделали типы инвариантными как в C# 2.0. причем очень жестко.
из-за этого нельзя уточнять тип в параметрах методов и в возвращаемых значениях.
Перепуг назывался "компиляция в IL", для того, чтобы статические проверки компилятора гарантировали в большем количестве случаев работу в IL.

X++ изначально это статически типизированный язык натянутый на не очень строго типизированный рантайм.

MyClass x = otherValue;
x.myMethod(a);

Будет работать всегда, когда у otherValue есть метод совпадающий по имени и имеющий один обязательный параметр. Не важно, otherValue наследуется от MyClass или нет.

JFYI, Параметры методов, наоборот, должны быть контровариантными см. LSP.

Цитата:
были слухи, что в ax2012 делали перегрузку методов и генерики.
но ни перегрузки, ни генериков в аксапту так и не завезли.
Перегрузку завезли только со стороны использования (можно вызвать дотнетовский класс и вызов выберет правильную перегрузку). Не знаю в какой версии. В 365 точно есть. Дженерики официально не поддерживаются но какие-то варианты компилируются.

На уровне IL опциональные параметры компилируются в перегрузки.

Цитата:
в d365fo, насколько я помню, типы снова стали ковариантными.
после того, как в C# 4.0+ добавили ковариантность для генериков
Тут мне опять непонятно, что такое "типы ковариантные" если нет дженериков. Ковариантности возвращаемых значений функции нет.

Цитата:
сделано "как в c#" людьми, которые кроме c# ничего не знают.
Это же предположение же, ты ж не знаешь наверняка что знает человек который это делал?

Последний раз редактировалось belugin; 23.12.2020 в 23:21.
Старый 28.12.2020, 13:58   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
вот и меня настигло:

X++:
Common        translation;
FormObjectSet translationDS = translation.isFormDataSource() ? translation.dataSource() : null;
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 115
Размер:	44.8 Кб
ID:	13016  
__________________
полезное на axForum, github, vk, coub.
Старый 28.12.2020, 14:12   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Damn Посмотреть сообщение
Это в какой версии Ax2012 такая фантастика появилась ?
Я даже в .net framework не нашёл такую generic-конструкцию для System.Array
ну... 'System.Collections.Generic.List<String> list;'

проверил. не работает. был же сарайчик...

значит, я путаю.


Цитата:
Сообщение от belugin Посмотреть сообщение
В джаве изначально не было дженериков как и в X++ и в С# какие именно типы были ковариантны?
в джаве изначально генериков не было.
их ввели где-то в 6ой версии.
ввели сразу ковариантные.

Цитата:
Сообщение от belugin Посмотреть сообщение
Вот хочется проверить. У кого под руками есть 2012, можете проверить, что поддерживается именно ковариантность а не произвольное переопределение.
в ax2012 при компиляции тип должен сопадать точно. что в параметрах, что в типе возвращаемого значения.

Цитата:
Сообщение от belugin Посмотреть сообщение
Перепуг назывался "компиляция в IL", для того, чтобы статические проверки компилятора гарантировали в большем количестве случаев работу в IL.
ну... можно и так назвать этот перепуг.

Цитата:
Сообщение от belugin Посмотреть сообщение
Это же предположение же, ты ж не знаешь наверняка что знает человек который это делал?
конечно. это всего лишь мое личное мнение.
__________________
полезное на axForum, github, vk, coub.
Старый 28.12.2020, 22:08   #18  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
в джаве изначально генериков не было.
их ввели где-то в 6ой версии.
ввели сразу ковариантные.
Что значит ковариантные дженерики? Как я понимаю, сейчас есть возможность сделать инвариантные, ковариантные и котравариантные типы. Причем, по умолчанию, они инвариантные. Была возможность описать ковариантность начиначая с первой версии, где были дженерики?

Цитата:
в ax2012 при компиляции тип должен сопадать точно. что в параметрах, что в типе возвращаемого значения.
Упс, я имел ввиду Ax до 2012.
Старый 28.12.2020, 23:27   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Что значит ковариантные дженерики?
...
Упс, я имел ввиду Ax до 2012.
Эммм... Макс, если честно, то я совсем запутался. А раскручиывать цепочку цитат и контр-вопросов совсем нет никакого желания.
Но совершенно очевидно, что у тебя есть особое мнение по этому поводу.
Также несомненно, что я могу дико ошибаться.

вот исходный вопрос:
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Использование функций при вычислении значений тринарных операторов в Ax2012 R3 в процессе компиляции выдает предупреждение:

Типы операндов не совместимы с оператором

Как это можно вылечить, оставаясь в рамках тринарных операторов?

Чтобы было полезно и познавательно читателям аксфорума
можешь (без оглядки на мои ответы) сформулировать в одном посте:
1. что можно сделать с подобными тренарными операторами в ax2012? (примеры рассыпаны выше по ветке)
2. почему и зачем это возникло в ax2012 на твой взгляд? понятно, что для совместимости в CIL. А в CIL это зачем и почему раньше этого в X++ не было?
3. какова ситуация с тренарными операторами в D365FO и почему так случилось?
4. а также любые твои мысли на тему ветки - будет интересно.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 28.12.2020 в 23:36.
Старый 29.12.2020, 07:27   #20  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от mazzy Посмотреть сообщение
тренарными операторами
Тернарными операторами.
Прошу прощения что поправляю.
__________________
Дмитрий
За это сообщение автора поблагодарили: mazzy (2).
Теги
ax2012, ax2012r3, тернарный оператор

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2012: базовые типы и результаты операторов div и mod отличаются в X++ и в CIL gl00mie DAX: Программирование 0 25.09.2014 11:13
Ax3 - Модуль Учет затрат egorych DAX: Функционал 15 12.12.2013 17:58
emeadaxsupport: Inventory closing differences between AX4.0 and AX2012 using weighted average costing method Blog bot DAX Blogs 0 27.12.2012 19:11
роли, типы пользователей и лицензирование AX2012 wojzeh DAX: Администрирование 1 22.07.2011 23:50
Date Daido DAX: Программирование 6 28.09.2007 11:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:37.