Data type widening
- Last Updated: April 24, 2023
- 3 minute read
- OpenEdge
- Version 13.0
- Documentation
Data type widening
Object-oriented programming, in support of strong typing, typically requires any argument that you pass to a constructor or method parameter to have a data type that exactly matches the data type used to define the parameter. Widening is a feature of many object-oriented programming languages that allows you to pass a different data type to a constructor or method than the data type that is defined for the parameter itself. Widening typically allows this, as long as the passed data type is structurally capable of handling the data that you are passing through the parameter to the data type of the destination. ABL supports widening for passing parameters to ABL class-based constructors and methods. For more information, see Develop Object-oriented ABL Applications.
ABL also supports a form of widening for passing parameters to .NET constructors and methods. In this case, there are more .NET data types that can be involved in passing data to a widened data type than ABL data types in an ABL user-defined constructor or method. Thus, ABL provides special support for data type widening when passing .NET parameters involving ABL primitive and .NET mapped data types.
The following table lists .NET data types with default ABL data
type mappings that support other ABL widening data types for passing primitive data to a
.NET INPUT parameter. In general, for each ABL data type
passed as an INPUT parameter, if another ABL data type
exists that can hold a smaller value acceptable to the corresponding .NET data type, you can
use that other ABL data type to pass the value. For example, where the default ABL data type
mapping is DECIMAL, the INTEGER and INT64 data types can also hold
values that the .NET data type can accept for INPUT. For
all other implicit data type mappings (see Table 1), you can use only the specified ABL data type to pass a .NET parameter
for INPUT.
| .NET parameter object type | C# parameter primitive type | ABL implicit mapping data type | ABL INPUT widening data type |
|---|---|---|---|
System.DateTime
|
– |
DATETIME
|
DATE
|
System.Decimal
|
decimal
|
DECIMAL
|
INTEGER, INT64
|
System.UInt32
|
uint
|
INT64
|
INTEGER1 |
System.Int64
|
long
|
INT64
|
INTEGER
|
System.UInt64
|
ulong
|
DECIMAL
|
INTEGER1, INT64 1
|
System.Double
|
double
|
DECIMAL
|
INTEGER, INT64
|
System.Single
|
float
|
DECIMAL
|
INTEGER2, INT642
|
The following table lists .NET data types with default ABL data type
mappings that support other ABL widening data types for passing primitive data to a .NET
OUTPUT parameter. In general, for each ABL data type
passed as an OUTPUT parameter, if another ABL data type
exists that can accept a larger value that is passed from the corresponding .NET data type,
you can use that other ABL data type to accept the value. For example, where the default ABL
data type mapping is INTEGER, the INT64 and DECIMAL data types can also accept
values passed from the .NET data type for OUTPUT. For all
other implicit data type mappings (see Table 1), you can use only the specified ABL data type to pass a .NET parameter
for OUTPUT.
| .NET parameter object type | C# parameter primitive type | ABL implicit mapping data type | ABL OUTPUT widening data type |
|---|---|---|---|
System.Byte
|
byte
|
INTEGER
|
INT64, DECIMAL
|
System.SByte
|
sbyte
|
INTEGER
|
INT64, DECIMAL
|
System.Char
|
char
|
CHARACTER
|
LONGCHAR
|
System.DateTime
|
– |
DATETIME
|
DATETIME-TZ
|
System.Int16
|
short
|
INTEGER
|
INT64, DECIMAL
|
System.UInt16
|
ushort
|
INTEGER
|
INT64, DECIMAL
|
System.Int32
|
int
|
INTEGER
|
INT64, DECIMAL
|
System.UInt32
|
uint
|
INT64
|
DECIMAL
|
System.Int64
|
long
|
INT64
|
DECIMAL
|
Note that similar to passing ABL parameters to ABL class-based
methods, data widening is not supported for passing INPUT-OUTPUT parameters to .NET methods. Because the data is moving in both
directions, no single widening choice can work for both directions. Thus, for INPUT-OUTPUT parameters that you pass to a .NET method, you must
use the appropriate ABL implicit mapping data type.