AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.10.2009, 10:36   #1  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
? Как работает тернарный оператор
Почему для этого кода, в предпоследней строке, вываливает ошибка "Типы операнда не совместимы с оператором.":
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
странный код... это метод construct() какого то класса? это код стандартного функционала?
может просто привык, но обычно в construct() используется оператор switch...

теперь по существу, предположу что класс EditMove не является наследником класса, который инициализируется.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.10.2009, 11:02   #3  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
С наследованием все в порядке.

Код свой. Для меня такой код выглядит более "чистым" и декларативным чем switch. Обратите внимание, что условия могут буть сколько угодно сложными. Второе, компилятор требует обязательно вернуть значение, а это более и безопасно и более читаемо, явно видно какой результат хочет получить программист который это писал. А а не просто "делай то не знаю что".
Ну где-то так.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
За это сообщение автора поблагодарили: miklenew (-1).
Старый 22.10.2009, 11:15   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Попробуйте взять в скобки вложенные операторы.
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
по проблеме.
Думаю должна помочь инкрементная компиляция класса родителя
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.10.2009, 12:17   #7  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Цитата:
Сообщение от 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  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Вот так заработало:
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  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от cerbo Посмотреть сообщение
Все это ребята не весело
может стоило использовать стандартный в axapta подход, как было предложено выше? т.к. все что не вписывается в понятие "стандартный", другим людям будет сложнее поддерживать
Старый 22.10.2009, 13:17   #10  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от cerbo Посмотреть сообщение
Все это ребята не весело
Не хотел бы оказаться на месте компилятора...

http://www.delphikingdom.com/asp/vie...?catalogid=528
__________________
Best Regards,
Roman
Старый 22.10.2009, 13:42   #11  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Господа хорошие. Пост вообще-то был о проблемах компилятора, а не про стиль программирование. Я не хочу с вами спорить, но вы не правы.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 13:57   #12  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от cerbo Посмотреть сообщение
ГЯ не хочу с вами спорить, но вы не правы.
Это - ПЯТЬ!

Но - минус в репутацию. Уж извините.

Можете ответить тем же
__________________
Best Regards,
Roman
Старый 22.10.2009, 14:14   #13  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от cerbo Посмотреть сообщение
Я не хочу с вами спорить, но вы не правы.
человек считает себя гением
За это сообщение автора поблагодарили: RVS (1).
Старый 22.10.2009, 14:34   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
человек считает себя гением
Да уж...
тут весь форум полон ничего не сведущими людьми, которые советуют что то непонятное и непривычное
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.10.2009, 15:17   #15  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Цитата:
Сообщение от lev Посмотреть сообщение
Да уж...
тут весь форум полон ничего не сведущими людьми, которые советуют что то непонятное и непривычное
В чем же я по вашему несведующий, потрудитесь объяснить
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 15:23   #16  
anykey is offline
anykey
Участник
 
35 / 26 (1) +++
Регистрация: 04.12.2006
да и так:
X++:
    anytype any;
    ;
    any = i ? 2 : "d";
не хочет, и с наследниками классов путается. Работает, если только в условии а-ля
класс_а : класс_б
один из них наследует другой. В случае же, когда они наследуются от класс_с - будет ошибка типов. Если следующим в условии будет класс_с и он будет унаследован от класс_б, ругаться не будет.
Старый 22.10.2009, 15:27   #17  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от cerbo Посмотреть сообщение
В чем же я по вашему несведующий, потрудитесь объяснить
\Classes\InventMovement\constructNoThrow
попробуйте через тернарный оператор (если выкинуть даже вложенную логику)....
А вообще (простите меня), но это извращение.

Последний раз редактировалось Sada; 22.10.2009 в 15:30.
Старый 22.10.2009, 15:47   #18  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Альтернативное извращение
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  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Цитата:
Сообщение от Sada Посмотреть сообщение
\Classes\InventMovement\constructNoThrow
попробуйте через тернарный оператор (если выкинуть даже вложенную логику)....
А вообще (простите меня), но это извращение.
Ха-ха, изварщение как раз это ваш пример. В таких методах должно быть кристально ясно видно что с чем сопоставляется то есть: 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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от cerbo Посмотреть сообщение
В чем же я по вашему несведующий, потрудитесь объяснить
Это был сорказм на Вашу реплику:
Цитата:
Господа хорошие. Пост вообще-то был о проблемах компилятора, а не про стиль программирование. Я не хочу с вами спорить, но вы не правы.
по Вашему мнению, судя по посту, все кто вам посоветовал следовать Best Practice не правы (и это не один человек, заметьте), и только Ваше мнение правильное.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: miklenew (2).
Теги
best practice, x++, антипаттерн, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
почему на работает common.(fieldId)[idx] maze DAX: Программирование 3 31.08.2007 06:48
Тернарный оператор в select novic DAX: Программирование 7 10.07.2007 19:13
JOIN программно на форме не работает rohlenko DAX: Программирование 2 31.03.2005 15:41
Не работает Debugger Antidot DAX: Программирование 0 20.12.2004 13:53
CRM ABC, SWOT анализ Как это работает и работает ли вообще. ShadowFromXZone DAX: Функционал 16 02.03.2004 18:09

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:03.