Цитата:
Сообщение от
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, который занимался раньше просто дополнительными проверками) и эту недоделку устранили, насколько я вижу.