|
![]() |
#1 |
Участник
|
На последний вопрос сам спросил - сам ответил
![]() 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). |
![]() |
#2 |
Участник
|
Цитата:
Так как при таком способе 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. |
|
![]() |
#3 |
Участник
|
Цитата:
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+ добавили ковариантность для генериков ![]() это фича. Цитата:
if - это инструкция (statement), которая состоит из нескольких выражений тренарный - это одно выражение (expression) сделано "как в c#" людьми, которые кроме c# ничего не знают. если сформулировать утверждение полностью, то сразу станет понятно. достаточно дописать версию ![]() "из-за проблем с маршаллингом X++ <---> .net 3.5-" Цитата:
и не надо использовать эти угрёбищные суффиксы! пожалуйста. Цитата:
Христа ради! Цитата:
4. странные и мигающие глюки с map'ами Господи! Только не в global... там и так уже насрато... Последний раз редактировалось mazzy; 21.12.2020 в 04:54. |
|
|
За это сообщение автора поблагодарили: Logger (5). |
![]() |
#4 |
Участник
|
Цитата:
Я даже в .net framework не нашёл такую generic-конструкцию для System.Array ![]()
__________________
Дмитрий |
|
![]() |
#5 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
![]() |
#6 |
Участник
|
Гуглим:
Ковариа́нтность и контравариа́нтность[1] в программировании — способы переноса наследования типов на производные[2] от них типы — контейнеры, обобщённые типы, делегаты и т. п. Термины произошли от аналогичных понятий теории категорий «ковариантный» и «контравариантный функтор». Цитата:
Цитата:
Вот хочется проверить. У кого под руками есть 2012, можете проверить, что поддерживается именно ковариантность а не произвольное переопределение. Т.е. что контроллируется что метод производного класса обязан возвращать именно подкласс результата переопределенного метода, а не вообще все, что угодно, лишь бы оно было классом (назовем это пофиг-вариантностью) Цитата:
в ax2012 с какого-то перепуга разработчики сделали типы инвариантными как в C# 2.0. причем очень жестко.
из-за этого нельзя уточнять тип в параметрах методов и в возвращаемых значениях. X++ изначально это статически типизированный язык натянутый на не очень строго типизированный рантайм. MyClass x = otherValue; x.myMethod(a); Будет работать всегда, когда у otherValue есть метод совпадающий по имени и имеющий один обязательный параметр. Не важно, otherValue наследуется от MyClass или нет. JFYI, Параметры методов, наоборот, должны быть контровариантными см. LSP. Цитата:
были слухи, что в ax2012 делали перегрузку методов и генерики.
но ни перегрузки, ни генериков в аксапту так и не завезли. На уровне IL опциональные параметры компилируются в перегрузки. Цитата:
в d365fo, насколько я помню, типы снова стали ковариантными.
после того, как в C# 4.0+ добавили ковариантность для генериков ![]() Цитата:
сделано "как в c#" людьми, которые кроме c# ничего не знают.
Последний раз редактировалось belugin; 23.12.2020 в 23:21. |
|
![]() |
#7 |
Участник
|
Цитата:
проверил. не работает. был же сарайчик... значит, я путаю. Цитата:
их ввели где-то в 6ой версии. ввели сразу ковариантные. Цитата:
Цитата:
конечно. это всего лишь мое личное мнение. |
|
![]() |
#8 |
Участник
|
Цитата:
Цитата:
в ax2012 при компиляции тип должен сопадать точно. что в параметрах, что в типе возвращаемого значения.
|
|
![]() |
#9 |
Участник
|
Эммм... Макс, если честно, то я совсем запутался. А раскручиывать цепочку цитат и контр-вопросов совсем нет никакого желания.
Но совершенно очевидно, что у тебя есть особое мнение по этому поводу. Также несомненно, что я могу дико ошибаться. вот исходный вопрос: Цитата:
Чтобы было полезно и познавательно читателям аксфорума можешь (без оглядки на мои ответы) сформулировать в одном посте: 1. что можно сделать с подобными тренарными операторами в ax2012? (примеры рассыпаны выше по ветке) 2. почему и зачем это возникло в ax2012 на твой взгляд? понятно, что для совместимости в CIL. А в CIL это зачем и почему раньше этого в X++ не было? 3. какова ситуация с тренарными операторами в D365FO и почему так случилось? 4. а также любые твои мысли на тему ветки - будет интересно. Последний раз редактировалось mazzy; 28.12.2020 в 23:36. |
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от 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, тернарный оператор |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|