Почему в Microsoft Dynamics, 365 я не могу встроить экземпляр FormDataSource?

У меня есть следующий метод, который компилируется:

          private void onModifiedFilter(FormControl sender)
    {
        FormDataSource mainAccount_ds = sender.formRun()
            .dataSource(formDataSourceStr(MainAccount, MainAccount));
        mainAccount_ds.executeQuery();
    }

Поскольку у меня нет другого применения, я хотел бы встроить значение и упростить код, чтобы:

          private void onModifiedFilter(FormControl sender)
    {
        sender.formRun()
            .dataSource(formDataSourceStr(MainAccount, MainAccount))
            .executeQuery();
    }

Однако это не может быть скомпилировано с:

Код серьезности Описание Состояние подавления строки файла проекта Ошибка ClassDoesNotContainMethod: класс «FormObjectSet» не содержит определения для метода «executeQuery», а метод расширения «executeQuery», принимающий первый аргумент типа «FormObjectSet», не найден в любом классе расширения. Packt_MainAccountExtension (ISV) [ExpenseManagement] C:\AOSService\PackagesLocalDirectory\Bin\XppSource\ExpenseManagement\AxClass_Packt_MainAccountForm_Extension.xpp 18

  • Как / почему происходит захват mainAccount_ds изменить возможность компиляции этого метода?
  • Есть ли другие способы выразить это без ненужного сбора данных?
  • Когда еще в D365 мне следует ожидать некоторого волшебства, когда мне нужно будет захватить значение, чтобы использовать его, вместо того, чтобы напрямую вызывать метод для не захваченного возвращаемого значения?

1 ответ

Чтобы ответить на ваш главный вопрос: потому что компилятор не может определить правильный тип понижающего преобразования из возвращаемого значения метода.

Чтобы ответить на ваши дополнительные вопросы:

  • "Как / почему захват mainAccount_ds изменяет возможность компиляции этого метода?"

Добавление mainAccount_dsпеременная сообщает компилятору, какой тип возвращаемого значения метода ожидается во время выполнения. Обратите внимание, что executeQuery метод определен только в FormDataSource класс, но не в FormObjectSet родительский класс, который является типом возвращаемого значения dataSource метод.

  • «Есть ли другие способы выразить это без ненужного сбора данных?»

Я так не думаю. Пока есть as для явных понижающих преобразований, я не нашел способа использовать его в выражении вызова связанного метода.

  • «Когда еще в D365 мне следует ожидать некоторого волшебства, когда мне нужно будет захватить значение, чтобы использовать его, вместо того, чтобы напрямую вызывать метод для не захваченного возвращаемого значения?»

Я надеюсь, что другие ответы прояснили, что здесь не происходит никакого волшебства. Компилятор правильно предотвращает в этом случае неопределенное снижение.

Кроме того, вы можете прочитать о приведении типов в x++. Casting и ОператорыExpression - хорошее место для начала.

Другие вопросы по тегам