25.09.2014, 12:32 | #1 |
Участник
|
Switch по контейнеру на сервере в дебаге валит сервер:)
X++: static server void main(Args _args) { ; switch ([tablenum(InventTable), tablenum(LedgerTable)]) { case [tablenum(InventTable), tablenum(LedgerTable)]: info('test'); } } Проверено на 2009 и 2012 R3. |
|
|
За это сообщение автора поблагодарили: mazzy (2), S.Kuskov (3), xiety (1). |
25.09.2014, 12:35 | #2 |
Участник
|
Проверил в 2009. Падает .
|
|
25.09.2014, 13:26 | #3 |
Боец
|
Я бы на месте сервера тоже упал бы, увидев такую конструкцию
|
|
|
За это сообщение автора поблагодарили: mazzy (2), AlGol (1), madm (1). |
25.09.2014, 14:23 | #4 |
Талантливый разгвоздяй
|
Действительно, а какой смысл такой конструкции?))
|
|
25.09.2014, 14:33 | #5 |
Участник
|
Что-то типа Decision table
|
|
25.09.2014, 15:05 | #6 |
Участник
|
|
|
25.09.2014, 15:35 | #7 |
Участник
|
Баги сервера потихонечку переселяются в мозг X++ программиста и поражают его часть, отвечающую за логику
Почему контейнеры можно сравнивать и использовать в качестве ключа у map но использование в case - это что-то запредельное? |
|
|
За это сообщение автора поблагодарили: skuull (1). |
25.09.2014, 15:37 | #8 |
Участник
|
|
|
25.09.2014, 15:56 | #9 |
Талантливый разгвоздяй
|
Ну против контейнера в свиче ничего не имею, пример удивил.. Искал тайный смысл.
|
|
25.09.2014, 16:58 | #10 |
Участник
|
Цитата:
Цитата:
Resolved this bug as ‘Won’t Fix’. We can consider this for fixing when we have customer reporting this issue.
Also, this seems to be a corner scenario where in we are using the Switch statement is using the container type. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
25.09.2014, 17:20 | #11 |
Участник
|
|
|
25.09.2014, 23:14 | #12 |
Боец
|
Цитата:
Ничего запредельного, но конструкция неудачная - нетипичная, редкая (если вообще где-то встречается), режет глаз, вводит в ступор, нечитабельна. В данном тестовом примере ее еще можно прочесть - контейнер "раскрыт". Если же там будут переменные кейзиться, то будет еще сложнее. Наличие бага в последней версии системы подтверждает неюзабельность конструкции и не вызывает удивления. В целом же, я избегаю использование контейнеров настолько, насколько это возможно (разве что str2con/con2str) и всем настоятельно рекомендую. Ну а глядя в целом на AX2012, на ее новые фреймворки, UIs, схватившись за голову, становится очевидным, что у MS-разработчиков вообще нет понятия запредельности... Уверен, вы еще не раз нас удивите и не такими конструкциями |
|
26.09.2014, 06:47 | #13 |
Участник
|
|
|
26.09.2014, 07:30 | #14 |
Участник
|
workaround или точнее сказать debugaround:
X++: switch (true) { case [tablenum(InventTable), tablenum(LedgerTable)] == [tablenum(InventTable), tablenum(LedgerTable)]: info('test'); } |
|
26.09.2014, 08:40 | #15 |
Участник
|
Цитата:
X++: container key = [x, y]; if (key == [1, 2]) { } else if (key == [2, 3]) { } else { } |
|
26.09.2014, 10:01 | #16 |
Участник
|
Чисто теоретически в switch можно при необходимости пропустить break
P.S.: Вот в этой ветке уже было обсуждение elseif VS switch Последний раз редактировалось S.Kuskov; 26.09.2014 в 10:11. |
|