Показать сообщение отдельно
Старый 29.12.2020, 09:47   #21  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (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).