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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.12.2020, 04:18   #1  
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).
Старый 23.12.2020, 14:34   #2  
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   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,160 / 1289 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Damn Посмотреть сообщение
Это в какой версии Ax2012 такая фантастика появилась ?
Кстати, да. Я считал, что в 2012 нужно извращаться через рефлексию а-ля подобному OXML_RU::invokeGeneric или тому, что в SrsProxy.
Что-то появилось более простое?
За это сообщение автора поблагодарили: Logger (3).
Старый 23.12.2020, 23:09   #4  
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, 14:12   #5  
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   #6  
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   #7  
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   #8  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от mazzy Посмотреть сообщение
тренарными операторами
Тернарными операторами.
Прошу прощения что поправляю.
__________________
Дмитрий
За это сообщение автора поблагодарили: mazzy (2).
Старый 29.12.2020, 09:47   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Эммм... Макс, если честно, то я совсем запутался. А раскручиывать цепочку цитат и контр-вопросов совсем нет никакого желания.
Но совершенно очевидно, что у тебя есть особое мнение по этому поводу.
Также несомненно, что я могу дико ошибаться.
Мне интересно, если бы кто-то у кого под руками есть Ax4 или Ax3 сделал следующий эксперимент.

class MyClass { MyClass test(){ return null } }
class MyExtendedClass extends MyClass { SysAnyType test(){ return null } }

Цитата:
1. что можно сделать с подобными тренарными операторами в ax2012? (примеры рассыпаны выше по ветке)
Можно попробовать ввести промежуточные переменные с определением конкретного типа.

Цитата:
2. почему и зачем это возникло в ax2012 на твой взгляд? понятно, что для совместимости в CIL.
Я думаю, это ошибка или недоделка вывода типов для тернарной операции.

Цитата:
А в CIL это зачем и почему раньше этого в X++ не было?
Тут надо разбираться как работает CIL внутри я это не так хорошо знаю. В том числе с точки зрения безопасности.

В X++ до 2012 нет гарантии, что если ты вызвал метод x на переменной типа y ты вызовется именно метод класса y. В переменной может лежать объект любого класса и, если у него есть метод x то вызовется он.

А если нет, то будет исключение. Причем не когда возникает несовместимое присваивание, а когда вызов, что может быть гораздо позже и труднее искать основную причину ошибки.

Цитата:
3. какова ситуация с тренарными операторами в D365FO и почему так случилось?
Пример из заголовка и твой пример компилируются без ошибок (после добавления недостающего метода). Только ворнинги:

Warning 'as' is obsolete: '"Use the AS operator instead."'

Цитата:
4. а также любые твои мысли на тему ветки - будет интересно.
Был компилятор написанный на C++ сто лет назад, притворяющийся языком со сторогой статической типизацией, но при этом позволяющий иногда нарушать безобразия.

Потом решили приделать CIL и привести в соответствие типизацию компилятора и рантайма. Чтобы раньше получать сообщения об ошибках. С тернарным оператором что-то не так - я думаю какая-то ошибка или недоделка в выводе типов.

В Dyn365FO компилятор переписали на C# (Вернее, доделали XLNT, который занимался раньше просто дополнительными проверками) и эту недоделку устранили, насколько я вижу.
За это сообщение автора поблагодарили: Logger (3).
Старый 02.01.2021, 18:08   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Мне интересно, если бы кто-то у кого под руками есть Ax4 или Ax3 сделал следующий эксперимент.

class MyClass { MyClass test(){ return null } }
class MyExtendedClass extends MyClass { SysAnyType test(){ return null } }
ax4. см. скриншоты.

Т.е. типы в методах потомках не проверяются на хоть какое-нибудь соответствие типам родителей. Типы проверяются только при присваивании (явном или неявном).
Убедил.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 55
Размер:	117.2 Кб
ID:	13022   Нажмите на изображение для увеличения
Название: 2.PNG
Просмотров: 54
Размер:	147.3 Кб
ID:	13023  

__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: belugin (5).
Старый 29.12.2020, 09:48   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
Чтобы было полезно и познавательно читателям аксфорума
можешь (без оглядки на мои ответы) сформулировать в одном посте:
1. что можно сделать с подобными тернарными операторами в ax2012? (примеры рассыпаны выше по ветке)
2. почему и зачем это возникло в ax2012 на твой взгляд? понятно, что для совместимости в CIL. А в CIL это зачем и почему раньше этого в X++ не было?
3. какова ситуация с тернарными операторами в D365FO и почему так случилось?
4. а также любые твои мысли на тему ветки - будет интересно.
Кстати, да.
Как-то мало кто прореагировал.
Вопросы интересные и нужные на практике.
Старый 20.01.2021, 17:38   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
гуглить в сторону "ковариантность" и "инвариантность".
https://ru.wikipedia.org/wiki/%D0%9A...D%D0%B8%D0%B5)

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

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

в качестве побочного эффекта получили вот такие затыки в тренарных операторах, а также в map (который AOT).
случайно попалась ссылка с рядом пояснений от от архитекторов Аксапты.
Оставлю тут
https://docs.microsoft.com/en-us/arc...the-x-language
X++: Forthcoming changes to the X++ language

https://docs.microsoft.com/en-us/arc...namics-ax-2012
Теги
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, время: 09:29.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.