Показать сообщение отдельно
Старый 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).