表达式中的隐式转换

隐式转换或隐式转换是 Architect 对一种数据类型进行隐式转换并将结果值类型转换为另一种数据类型的行为。 Architect 仅对有效表达式文本的结果值类型执行隐式转换。 隐式转换利用了类型层次结构或类型表示的某些功能。 当一种类型的表达式与不接受该类型的特定变量 的上下文中使用时,Architect 会执行 implicit 转换。

在 Architect 中,流程作者只能分配 “赞” 类型的值。 字符串变量只能具有字符串值赋值。 但是 Architect 解析器会评估每个表达式的数据类型,并在可能的情况下通过隐式转换协调流程作者的结果。

在以下示例中,流程作者希望整数表示为字符串。 在运行时,表达式的结果是字符串 “5”。

ToString(5)

这是一个 显式强制转换示例, 其中表达式作者通过添加 toString 函数调用并传入整数将整数值转换为 5 转换为字符串。 在运行时求值时,此表达式的结果值将为 “5”。

流程作者还可以输入以下有效的字符串表达式:

ToString(3+4)

此表达式被视为 显式强制转换。 流程作者指示解析器将整数转换为字符串。 隐式强制转换仅在输入 的表达式文本的 结果类型上发生。

流程作者也可以输入以下有效的字符串表达式:

3+4

关于 “like” 类型,此表达式无效,因为该表达式试图为字符串赋值整数,但我们知道字符串变量只能具有字符串赋值。 但是通过 隐式强制转换,Architect 可以解析表达式。 解析器在表达式周围添加 toString 值,将整数转换为字符串,返回以下表达式:

ToString(3+4)

当 Architect 执行隐式转换时,它会在表达式的 “编辑表达式” 对话框中返回包含转换详细信息的消息。

注意: 这些转换消息仅显示在 “编辑表达式” 对话框中。 它们不会出现在字段级文字或表达式模式下。 但是,无论是在字段级别还是在编辑表达式对话框中输入表达式,Architect 都会转换表达式。

隐式转换仅对采用一个参数的类型转换函数执行。 具有多个允许参数的类型转换函数不能进行隐式转换,因为解析器无法在第一个参数之后处理对任何参数的操作。

在前面的例子中,我们知道结果将是整数值 7。 但是,当我们不知道设计时的价值是多少时,请考虑一个例子:

Flow.MyInteger + 5

在这种情况下,Flow.myInteger 是一种整数数据类型。 从概念上讲,我们知道结果值是 “Flow.myInteger 的值加上 5 的值”。 我们不知道 Flow.myInteger 的值是什么,但我们 确实 知道它是一个整数值加上另一个整数值,这将导致一个整数值。 这对于隐式转换非常重要: 整数 + 整数 = 整数的结果,结果类型为字符串。

当解析器计算表达式时,它会解释结果类型不是字符串,而是表达式文本的结果是整数。 因此,它将 toString 作为隐式转换添加,并将结果转换为字符串,这是所需的结果。

与前面的示例一样,当 Architect 执行隐式转换时,它会在表达式的 “编辑表达式” 对话框中返回一条包含转换详细信息的消息。 这些转换消息仅显示在 “编辑表达式” 对话框中。 它们不会出现在字段级文字或表达式模式下。 但是,无论是在字段级别还是在编辑表达式对话框中输入表达式,Architect 都会转换表达式。

如果结果是有效的表达式,解析器只会执行隐式强制转换。 但是让我们考虑一个结果无效的例子。 我们知道,在初始版本中,Architect 仅支持三种语言的运行时数据播放: en-US、fr-CA 和 es-US。 因此,如果流程在 en-US、fr-CA 或 es-US 中运行,则以下表达式有效:

ToAudioNumber(5005)

建筑师可以用三种语言中的任何一种表示数字 5005。 但是,如果流程作者将捷克共和国 (CS-CZ) 添加为受支持的语言,而该语言不是包含运行时数据播放支持的 3 种语言之一,该怎么办? 以下示例说明了 Architect 如何处理无效表达式。

当流程作者开始键入整数时,Architect 会立即返回错误消息:

如果流程作者将 toAudionNumber 函数作为显式强制转换添加,Architect 仍会返回错误:

不支持数据播放