World Library  
Flag as Inappropriate
Email this Article

Variant type

Article Id: WHEBN0009731827
Reproduction Date:

Title: Variant type  
Author: World Heritage Encyclopedia
Language: English
Subject: Visual Basic, Tagged union, List of data structures, ThinBasic, Data structure
Collection: Basic Programming Language Family, Data Types
Publisher: World Heritage Encyclopedia

Variant type

Variant is a data type in certain programming languages, particularly Visual Basic, OCaml, and C++ when using the Component Object Model.

In Visual Basic (and Visual Basic for Applications) the Variant data type is a tagged union that can be used to represent any other data type (for example, integer, floating-point, single- and double-precision, object, etc.) except fixed-length string type and record types. In Visual Basic any variable, not declared explicitly or the type of which is not declared explicitly, is taken to be a variant.

While the use of not explicitly declared variants is not recommended, they can be of use when the needed data type can only be known at runtime, when the data type is expected to vary, or when optional parameters and parameter arrays are desired. In fact, languages with a dynamic type system often have variant as the only available type for variables.

Among the major changes in Visual Basic .NET, being a .NET language, the variant type was replaced with the .NET object type. There are similarities in concept, but also major differences, and no direct conversions exist between these two types. For conversions, as might be needed if Visual Basic .NET code is interacting with a Visual Basic 6 COM object, the normal methodology is to use .NET marshalling.

In unrelated usage, variant type is also used to refer to an algebraic data type (comparable to a tagged union), whose constructors are often called variants. In languages such as OCaml and Haskell, this kind of variant type is the standard language building block for representing many data structures.


  • Examples 1
    • Format 1.1
    • Types 1.2
  • Common uses 2
    • Collections 2.1
    • Dispatch method calls 2.2
    • Optional parameters 2.3
  • External links 3


In Visual Basic, a variant named A can be explicitly declared as shown in either of these two examples:

Dim A
Dim A as Variant

In Delphi, a variant named A is declared in the following way:

var A: variant;


A variable of variant type, for brevity called a "variant", as defined in Visual Basic, needs 16 bytes storage and its layout is as follows:

Offset Size Description
0 2 The value returned by VarType; specifies what kind of data the variant contains.
2 6 Reserved bytes; should be set to zero.
8 up to 8 The data the variant contains.


A few examples of variants that one can encounter in Visual Basic follow. In other languages other kinds of variants can be used as well.

VarType Data bytes C and C++ type TypeName
0 Empty1
1 Null2
10 2A000A80 HRESULT (long int) Error
10 80020004 HRESULT (long int) Missing3
17 2A BYTE (unsigned char) Byte
11 FFFF VARIANT_BOOL (short int) Boolean
2 2A00 short int Integer
3 2A000000 long int Long
4 00002842 float Single
5 0000000000004540 double Double
6 A068060000000000 CY structure Currency
7 00000000C0D5E140 DATE (double) Date
8 xxxxxxxx BSTR (wchar_t pointer) String
9 00000000 IUnknown pointer Nothing4
9 xxxxxxxx IUnknown pointer Object reference5
  • 1 The type of an uninitialized variant.
  • 2 The type of a NULL value in a database, that is, not uninitialized, nor equivalent to a C++ null pointer.
  • 3 Missing arguments are actually a particular Error value titled "parameter not found".
  • 4 The object type set to a null reference.
  • 5 TypeName will return the name of the class of the object contained. The data would be an interface pointer, that is, a pointer to a pointer to a virtual method table (which is an array of function pointers).

Common uses


The Collection class in OLE Automation can store items of different data types. Since the data type of these items cannot be known at compile time, the methods to add items to and retrieve items from a collection use variants. If in Visual Basic the For Each construct is used, the iterator variable must be of object type, or a variant.

Dispatch method calls

In OLE Automation the IDispatch interface is used when the class of an object cannot be known in advance. Hence when calling a method on such an object the types of the arguments and the return value is not known at compile time. The arguments are passed as an array of variants and when the call completes a variant is returned.

Optional parameters

In Visual Basic a procedure argument can be declared to be optional by prefixing it with the Optional keyword. When the argument is omitted Visual Basic passes a special value to the procedure, called Missing in the table above, indicating that the argument is missing. Since the value could either be a supplied value or a special value, a variant must be used.

Function GetText(Optional ByVal Index) As String
    If IsMissing(Index) Then
        GetText = Item(CurrentItem)
        GetText = Item(Index)
    End If
End Function

Similarly the keyword ParamArray can be used to pass all following arguments in a variant array.

External links

  • C++ Boost.Variant
This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.
Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.
By using this site, you agree to the Terms of Use and Privacy Policy. World Heritage Encyclopedia™ is a registered trademark of the World Public Library Association, a non-profit organization.

Copyright © World Library Foundation. All rights reserved. eBooks from Project Gutenberg are sponsored by the World Library Foundation,
a 501c(4) Member's Support Non-Profit Organization, and is NOT affiliated with any governmental agency or department.