X# 中的 USUAL 类型是作为 .Net 结构实现的。它包含一个类型标志和一个值。值可以是以下类型之一:
NIL, Long, Date, Float, Array, Object, String, Logic, Codeblock, Symbol, Ptr, Int64, DateTime, Decimal, DateTime
该类型的内部类型名称是 XSharp.__Usual
类型 |
Usual 类型值 |
---|---|
NIL |
0 |
Long |
1 |
Date |
2 |
Float |
3 |
Array |
5 |
Object |
6 |
String |
7 |
Logic |
8 |
Codeblock |
9 |
Symbol |
10 |
Ptr |
18 |
Int64 |
22 |
DateTime |
26 |
Decimal |
27 |
Currency |
28 |
Binary |
29 |
请注意,本表中不包括某些常用类型值。编译器中有这些数字的定义,但它们从不存储在 USUAL 中。
因此,您可以写 UsualType(uValue) == REAL8,但这永远不会成真。
您可以将其他类型的值赋值给 USUAL,但这些值将被转换为第一个表中列出的类型。例如,如果将 DWORD 赋值给 USUAL,运行时将查看 DWORD 的值,如果小于或等于 MAX_LONG,则将其存储为 LONG。否则就会将其存储为 FLOAT。请注意,尽管我们支持 Int64 类型,但为了与 VO 兼容,DWORD 转换并不使用 Int64 类型。此外,如果将 PSZ 赋值给 USUAL,那么它将被存储为 STRING。因此,运行时将自动调用 Psz2String() 来获取字符串表示法。
名称 |
Usual 类型值 |
---|---|
Byte |
11 |
Short |
12 |
Word |
13 |
DWord |
14 |
Real4 |
15 |
Real8 |
16 |
PSZ |
17 |
Usual By Ref |
19 |
UInt64 |
23 |
Char |
24 |
Dynamic |
25 |
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 结构中实现。