Show/Hide Toolbars

XSharp

 

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 用作“:”运算符的左操作数,否则将引发编译时错误。

 

数值运算和混合类型的 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 结构中实现。