{{fbdoc item="title" value="Temporary Types"}}----
Creates a temporary copy of a user defined type

{{fbdoc item="syntax"}}##
	//result// = **Type**( //initializers//, ... )
		//or//
	//result// = **Type**<//typename//>( //initializers//, ... )
##
{{fbdoc item="param"}}
	##//initializers//##
		Initial values for the type
	##//typename//##
		The name of the ##[[KeyPgType Type]]## or ##[[KeyPgUnion Union]]##

{{fbdoc item="ret"}}
	A temporary copy of the type.

{{fbdoc item="desc"}}
	Used to create a temporary type.  If ##//typename//## is not explicitly given, it will be inferred from its usage if possible.  Usage of the temporary copy may include assigning it to a variable, passing it as a parameter to a procedure, or returning it as a value from a procedure.

	For a type without constructor, the temporary type syntax is allowed if all type data-fields are numeric primitives only and without any default initializers, but the compiler does a direct assignment instead of using a temporary copy if at same time the type is without destructor.

	The ##[[KeyPgConstructor Constructor]]## for the type, if there is one, will be called when the temporary copy is created, and the ##[[KeyPgDestructor Destructor]]## for the type, if there is one, will be called immediately after its use. But when there is a constructor, the temporary type expression may be simply replaced by ##//typename( initializers//, ... )##.

	It can create not only a temporary copy of an user defined type, but also a temporary copy of predefined data-type as a variable-length string or any numeric data-type (all standard data-types excluding fixed-length strings).

	It can also be used as an even shorter shortcut than ##[[KeyPgWith With]]## (see below) if you are changing all the records.

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/udt/temp-type.bas"}}%%(freebasic)
Type Example
	As Integer field1
	As Integer field2
End Type

Dim ex As Example

'' Filling the type by setting each field
ex.field1 = 1
ex.field2 = 2

'' Filling the type by setting each field using WITH
With ex
	.field1 = 1
	.field2 = 2
End With

'' Fill the variable's fields with a  temporary type
ex = Type( 1, 2 )
%%

{{fbdoc item="filename" value="examples/manual/udt/temp-type2.bas"}}%%(freebasic)
'' Passing a user-defined types to a procedure using a temporary type
'' where the type can be inferred.

Type S
  As Single x, y
End Type

Sub test ( v As S )
  Print "S", v.x, v.y
End Sub

test( type( 1, 2 ) )
%%

{{fbdoc item="filename" value="examples/manual/udt/temp-type3.bas"}}%%(freebasic)
'' Passing a user-defined type to a procedure using temporary types
'' where the type is ambiguous and the name of the type must be specified.

Type S
  As Single x, y
End Type

Type T
  As Integer x, y
End Type

Union U
  As Integer x, y
End Union

'' Overloaded procedure test()
Sub test overload ( v As S )
  Print "S", v.x, v.y
End Sub

Sub test ( v As T )
  Print "T", v.x, v.y
End Sub

Sub test ( v As U )
  Print "U", v.x, v.y
End Sub

'' Won't work: ambiguous
'' test( type( 1, 2 ) )

'' Specify name of type instead
test( type<S>( 1, 2 ) )
test( type<T>( 1, 2 ) )
test( type<U>( 1 ) )
%%

{{fbdoc item="diff"}}
	- New to ""FreeBASIC""

{{fbdoc item="see"}}
	- ##[[KeyPgType Type...End Type]]##
	- ##[[KeyPgTypeAlias Type (Alias)]]##

{{fbdoc item="back" value="CatPgUserDefTypes|User Defined Types"}}{{fbdoc item="back" value="CatPgProgrammer|Programmer's Guide"}}