在Microsoft Dynamics、365中,为什么我不能内联一个FormDataSource的实例?

In Microsoft Dynamics, 365, why can't I inline an instance of FormDataSource?

我有以下编译方法:

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

由于 mainAccount_ds 没有其他用途,我想内联该值并将代码简化为:

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

然而,编译失败:

Severity Code Description Project File Line Suppression State Error ClassDoesNotContainMethod: Class 'FormObjectSet' does not contain a definition for method 'executeQuery' and no extension method 'executeQuery' accepting a first argument of type 'FormObjectSet' is found on any extension class. Packt_MainAccountExtension (ISV) [ExpenseManagement] C:\AOSService\PackagesLocalDirectory\Bin\XppSource\ExpenseManagement\AxClass_Packt_MainAccountForm_Extension.xpp 18

回答您的主要问题:因为编译器无法根据 dataSource 方法的 return 值确定正确的向下转换类型。

回答您的其他问题:

  • "How/why 捕获 mainAccount_ds 会改变此方法的编译能力吗?"

mainAccount_ds 变量的添加告诉编译器在 运行 时期望 dataSource 方法的 return 值的类型。注意executeQuery方法只在FormDataSourceclass中定义,而在FormObjectSet父class中没有定义,是[=47]的类型=] dataSource 方法的值。

  • “有没有其他方法可以在不捕获不必要的数据的情况下表达这一点?”

我不这么认为。虽然有一个 as 运算符可以进行显式向下转换,但我还没有找到在链式方法调用表达式中使用它的方法。

  • “在 D365 中还有什么时候我应该期待一些魔法,我需要捕获一个值才能使用它,而不是直接在未捕获的 return 值上调用方法?”

我希望其他答案能说明这里没有魔法发生。在这种情况下,编译器会正确地阻止您进行未定义的向下转换。

此外,您可能想阅读 . Casting and Expression operators 中的演员表是一个很好的起点。