USUAL 类型是一种可以包含任何数据类型的数据类型。它内部包含一个类型标志和一个值。这种类型可以存储任何值。
编译器对这种类型进行特殊处理。当您将 USUAL 类型的值分配给另一种类型时,编译器不会警告您,但会自动生成必要的转换操作。
USUAL 主要用于与无类型代码兼容。不建议在新代码中使用它,因为编译器无法对一个或多个操作数为 USUAL 的表达式执行任何类型检查。任何数据类型错误只能在运行时发现。
作为 USUAL 声明的局部变量、参数和字段也比强类型变量产生更多的运行时开销。
可以将字面值 NIL 分配给任何类型为 USUAL 的存储位置。NIL 值表示没有任何其他数据类型或值,并在概念上等同于将 NULL 存储到引用类型中。NIL 是未初始化的本地 USUAL 变量的默认值。
当“:”运算符的左操作数为 USUAL 时,编译器将生成对指定为右操作数的方法、字段或属性的后期绑定调用。如果运行时 USUAL 中包含的值没有这样的成员,成员类型不正确或不可访问,或者名称评估为方法且参数数量或其类型不正确,则此调用可能失败。必须启用 /lb 编译器选项才能将 USUAL 用作“:”运算符的左操作数,否则将引发编译时错误。
当您在数值操作中组合两个常规变量时,结果的类型取决于操作数的类型。
主导原则是我们尽量不丢失小数部分。
通用规则如下:
•当左侧为小数时,结果也是左侧类型的小数
•当左侧不是小数且右侧为小数时,结果为右侧类型
•当两侧都是整数时,结果取两者中较大的类型。
LHS |
\ RHS |
LONG |
INT64 |
FLOAT |
CURRENCY |
DECIMAL |
LONG |
LONG |
INT64 |
FLOAT |
CURRENCY |
DECIMAL |
|
INT64 |
INT64 |
INT64 |
FLOAT |
CURRENCY |
DECIMAL |
|
FLOAT |
FLOAT |
FLOAT |
FLOAT |
FLOAT |
FLOAT |
|
CURRENCY |
CURRENCY |
CURRENCY |
CURRENCY |
CURRENCY |
CURRENCY |
|
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
USUAL 类型在 XSharp.__Usual 结构中实现。