| When calling between the runtime environment and existing COM interfaces, the CLR performs automatic data marshaling for CLR types into compatible COM types. Table C-1 describes the C# to COM default data type mapping. Table C-1. C# type to COM type mapping | C# type | COM type | | bool | VARIANT_BOOL | | char | unsigned short | | sbyte | Char | | byte | Unsigned char | | short | Short | | ushort | Unsigned short | | int | Int | | uint | Unsigned int | | long | Hyper | | ulong | Unsigned hyper | | float | Single | | double | Double | | decimal | DECIMAL | | object | VARIANT | | string | BSTR | | System.DateTime | DATE [1] | | System.Guid | GUID | | System.Currency | CURRENCY | | 1-dimensional arrays | SAFEARRAY | | Value types | Equivalently named struct | | enum | Equivalently named enum | | interface | Equivalently named interface | | class | Equivalently named CoClass | [1] COM dates are less precise, causing comparison problems. Table C-2. C# modifier/COM attribute mapping | C# modifier | COM attribute | | <no modifier> | [in] | | out | [out] | | ref | [in, out] | | <return value> | [out, retval] | |