Цитата:
Сообщение от
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... там и так уже насрато...