2.4.1 Intrinsic Types
In RD-VBA, a type is an intrinsic type if MS-VBAL mentions it. Whether a type is an intrinsic type does not depend on its specified semantics, nor on how RD-VBA models it.
VBIntrinsicType is the type-system abstraction that formalizes this classification; see RD-VBAL §2.4 Static Types.
Non-numeric Intrinsic Types
The non-numeric intrinsic types are:
| Type | Notes |
|---|---|
| VBArrayType | Array types; see §2.4.1.3. |
| VBFixedSizeArrayType | Array type; see §2.4.1.3. |
| VBResizableArrayType | Array type; see §2.4.1.3. |
| VBResizableByteArrayType | Array type; see §2.4.1.3. |
| VBBooleanType | |
| VBDateType | |
| VBEmptyType | |
| VBErrorType | |
| VBLongPtrType_x64 | LongPtr; see LongPtr. |
| VBLongPtrType_x86 | LongPtr; see LongPtr. |
| VBMissingType | |
| VBNullType | |
| VBObjectType | |
| VBStringType | String type; see §2.4.1.2. |
| VBFixedStringType | String type; see §2.4.1.2. |
| VBVariantType |
LongPtr
LongPtr is a different type in each pointer width: VBLongPtrType_x64 for a 64-bit pointer width, and VBLongPtrType_x86 for a 32-bit pointer width. The pointer width belongs to the environment; see RD-VBAL §6.0 Standard Library.
The data value type VBLongPtrValue has the VBType VBLongPtrType_x64 or VBLongPtrType_x86. Which of the two it has depends on the host environment; see RD-VBAL §2.5.2.1 Intrinsic Type Values.
2.4.1.1 VBNumericType
Numeric types are intrinsic types that represent a numeric value, regardless of the value's representation. VBNumericType is the type-system abstraction that formalizes this classification.
Every numeric type additionally implements one of three marker interfaces:
| Marker interface | Implemented by |
|---|---|
| IIntegralNumericType | All integer types |
| IFixedPointNumericType | All fixed-point numeric types |
| IFloatingPointNumericType | All floating-point numeric types |
The table of intrinsic numeric data types below shows the managed (.NET) minimum and maximum values, for simplicity.
| Type | Interface | Description | MinValue | MaxValue |
|---|---|---|---|---|
| VBByteType | IIntegralNumericType |
8-bit Byte unsigned integer |
Byte.MinValue (0) |
Byte.MaxValue (255) |
| VBIntegerType | IIntegralNumericType |
16-bit Integer signed integer |
Int16.MinValue (-32,768) |
Int16.MaxValue (32,767) |
| VBLongType | IIntegralNumericType |
32-bit Long signed integer |
Int32.MinValue (-2,147,483,648) |
Int32.MaxValue (2,147,483,647) |
| VBLongLongType | IIntegralNumericType |
64-bit LongLong signed integer |
Int64.MinValue (-9,223,372,036,854,775,808) |
Int64.MaxValue (9,223,372,036,854,775,807) |
| VBSingleType | IFloatingPointNumericType |
32-bit single-precision floating-point | Single.MinValue |
Single.MaxValue |
| VBDoubleType | IFloatingPointNumericType |
64-bit double-precision floating-point | Double.MinValue |
Double.MaxValue |
Floating-point types also define a SignificantIntegerDigits; see RD-VBAL §2.5.2.1.1 Numeric Values.
2.4.1.2 VBStringType
String types are internally represented using a UTF-16 standard .NET System.String value.
The string types are:
VBStringTypeVBFixedStringType
2.4.1.3 VBArrayType
Array types include the following implementations of VBArrayType:
VBFixedSizeArrayTypeVBResizableArrayTypeVBResizableByteArrayType
An array type does not encode any dimensions.
The value associated with an array type encodes the array dimensions; see VBArrayValue and its derived types, and RD-VBAL §2.5.2.1.2 Array Values. On every read after the array value is stored, VBArrayType.CreateValue(IBindingHandle) unboxes it unchanged.
Resizable Byte Arrays
If the item type of a resizable array value is VBByteType, the data type of the array is VBResizableByteArrayType.
VBResizableByteArrayType has specific let-coercion semantics attached, allowing implicit conversion to and from VBStringType; see RD-VBAL §5.5.1.2 Runtime semantics.
ReDim
| Array value | ReDim |
|---|---|
| VBFixedSizeArrayValue | Illegal with any VBFixedSizeArrayValue. |
| VBResizableArrayValue | May declare a VBResizableArrayValue, or redimension an already-declared VBResizableArrayValue. |
For the re-dimension of an existing array, the implicit declaration by an unqualified ReDim target, and ReDim bounds, see RD-VBAL §5.4.3.3 ReDim Statement.
Declared Array Types
The declaration pass binds the declared type of an array symbol from the array-dim clause alone (MS-VBAL §5.2.3.1.3 Array Dimensions and Bounds), before any bound is evaluated:
| Array-dim clause | Example | Declared type |
|---|---|---|
| One or more bounds | Dim g(1 To 3, 0 To 4) As Long |
VBFixedSizeArrayType |
Empty () clause |
Dim b() As Long |
VBResizableArrayType |
Trailing () on the As clause |
Dim b As Long() |
VBResizableArrayType |
Empty () clause, or trailing () on the As clause, with item type Byte |
Dim b() As Byte, Dim b As Byte() |
VBResizableByteArrayType (instead of VBResizableArrayType) |
An omitted array item type defaults to Variant (MS-VBAL §5.2.3.1 Module Variable Declaration Lists). This default is applied by a later normalization pass, not by the declaration pass.
The declaration pass keeps each array bound verbatim, as declared. The following are the concern of the semantic pass that materializes the array value (RD-VBAL §2.5.2.1.2 Array Values):
- evaluating each bound to a
Long; - resolving an omitted lower bound against
Option Base(see RD-VBAL §5.2.1 Option Directives).
⏮️ RD-VBAL §2.4 Static Types | ⏭️ RD-VBAL §2.4.2 Non-intrinsic Types