22.10.2009, 10:36 | #1 |
Участник
|
Как работает тернарный оператор
Почему для этого кода, в предпоследней строке, вываливает ошибка "Типы операнда не совместимы с оператором.":
X++: return _cmd == Command::CopyAll ? new EditCopyAll () : _cmd == Command::Copy ? new EditCopy () : _cmd == Command::MoveAll ? new EditMoveAll () : _cmd == Command::Move ? new EditMove () // ошибка "Типы операнда не совместимы с оператором." : null; X++: return _cmd == Command::CopyAll ? new EditCopyAll () //: _cmd == Command::Copy ? new EditCopy () //: _cmd == Command::MoveAll ? new EditMoveAll () //: _cmd == Command::Move ? new EditMove () : null; Это очередная баго-фича или есть смысл в таком поведении?
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
22.10.2009, 10:45 | #2 |
Ищущий знания...
|
странный код... это метод construct() какого то класса? это код стандартного функционала?
может просто привык, но обычно в construct() используется оператор switch... теперь по существу, предположу что класс EditMove не является наследником класса, который инициализируется.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
22.10.2009, 11:02 | #3 |
Участник
|
С наследованием все в порядке.
Код свой. Для меня такой код выглядит более "чистым" и декларативным чем switch. Обратите внимание, что условия могут буть сколько угодно сложными. Второе, компилятор требует обязательно вернуть значение, а это более и безопасно и более читаемо, явно видно какой результат хочет получить программист который это писал. А а не просто "делай то не знаю что". Ну где-то так.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
|
За это сообщение автора поблагодарили: miklenew (-1). |
22.10.2009, 11:15 | #4 |
Ищущий знания...
|
X++: static MyClass construct(TypeRun _typeRun) { MyClass retClass; switch(_typeRun) { case 1 : retClass = new MyClass_1(); break; case 2 : retClass = new MyClass_2(); break; default : retClass = new MyClass(); } return retClass; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
22.10.2009, 11:18 | #5 |
Участник
|
Попробуйте взять в скобки вложенные операторы.
X++: return _cmd == Command::CopyAll ? new EditCopyAll () : (_cmd == Command::Copy ? new EditCopy () : (_cmd == Command::MoveAll ? new EditMoveAll () : (_cmd == Command::Move ? new EditMove (): null))); // ошибка "Типы операнда не совместимы с оператором."
__________________
Axapta v.3.0 sp5 kr2 |
|
22.10.2009, 11:19 | #6 |
Ищущий знания...
|
по проблеме.
Думаю должна помочь инкрементная компиляция класса родителя
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
22.10.2009, 12:17 | #7 |
Участник
|
Цитата:
Сообщение от AndyD
Попробуйте взять в скобки вложенные операторы.
X++: return _cmd == Command::CopyAll ? new EditCopyAll () : (_cmd == Command::Copy ? new EditCopy () : (_cmd == Command::MoveAll ? new EditMoveAll () : (_cmd == Command::Move ? new EditMove (): null))); // ошибка "Типы операнда не совместимы с оператором."
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 Последний раз редактировалось cerbo; 22.10.2009 в 12:19. |
|
22.10.2009, 12:41 | #8 |
Участник
|
Вот так заработало:
X++: return _cmd == Command::CopyAll ? EditCopyAll::construct () : _cmd == Command::Copy ? EditCopy::construct () : _cmd == Command::MoveAll ? EditMoveAll::construct () : _cmd == Command::Move ? EditMove::construct () : null; Похоже действительно лажает компилятор, конструктор здесь имеет какое-то особое значение. Все это ребята не весело
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
22.10.2009, 12:48 | #9 |
Участник
|
|
|
22.10.2009, 13:17 | #10 |
Сенбернар
|
__________________
Best Regards, Roman |
|
22.10.2009, 13:42 | #11 |
Участник
|
Господа хорошие. Пост вообще-то был о проблемах компилятора, а не про стиль программирование. Я не хочу с вами спорить, но вы не правы.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
22.10.2009, 13:57 | #12 |
Сенбернар
|
Это - ПЯТЬ!
Но - минус в репутацию. Уж извините. Можете ответить тем же
__________________
Best Regards, Roman |
|
22.10.2009, 14:14 | #13 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: RVS (1). |
22.10.2009, 14:34 | #14 |
Ищущий знания...
|
Да уж...
тут весь форум полон ничего не сведущими людьми, которые советуют что то непонятное и непривычное
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
22.10.2009, 15:17 | #15 |
Участник
|
В чем же я по вашему несведующий, потрудитесь объяснить
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
22.10.2009, 15:23 | #16 |
Участник
|
да и так:
X++: anytype any; ; any = i ? 2 : "d"; класс_а : класс_б один из них наследует другой. В случае же, когда они наследуются от класс_с - будет ошибка типов. Если следующим в условии будет класс_с и он будет унаследован от класс_б, ругаться не будет. |
|
22.10.2009, 15:27 | #17 |
Программатор
|
\Classes\InventMovement\constructNoThrow
попробуйте через тернарный оператор (если выкинуть даже вложенную логику).... А вообще (простите меня), но это извращение. Последний раз редактировалось Sada; 22.10.2009 в 15:30. |
|
22.10.2009, 15:47 | #18 |
Участник
|
Альтернативное извращение
X++: #localMacro. case Command::%1: return new Edit%1(); #endmacro switch (_cmd) { #(CopyAll) #(Copy) #(MoveAll) #(Move) } return null X++: new SysDictClass(className2ID('Edit' + new DictEnum(enumNum(Command)).valueToSymbol(_cmd))).makeObject() НЕ ИСПОЛЬЗОВАТЬ В РАБОЧЕМ КОДЕ Последний раз редактировалось belugin; 22.10.2009 в 15:54. |
|
|
За это сообщение автора поблагодарили: miklenew (1). |
22.10.2009, 15:55 | #19 |
Участник
|
Ха-ха, изварщение как раз это ваш пример. В таких методах должно быть кристально ясно видно что с чем сопоставляется то есть: enum1->class1, enum2->calss2. И ничего более. Вложенную логику не "даже" надо выкидывать, а выкидывать обязательно. И еще в ахапте меня бесят эти функции по пол километра. Это что, по вашему, пример для подражания?
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005 |
|
|
За это сообщение автора поблагодарили: belugin (1). |
22.10.2009, 16:29 | #20 |
Ищущий знания...
|
Это был сорказм на Вашу реплику:
Цитата:
Господа хорошие. Пост вообще-то был о проблемах компилятора, а не про стиль программирование. Я не хочу с вами спорить, но вы не правы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: miklenew (2). |