Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The following table lists the C# built-in value types:
The following table lists the C# built-in reference types:
| C# type keyword | .NET type |
|---|---|
object |
System.Object |
string |
System.String |
delegate |
System.Delegate |
dynamic |
System.Object |
In the preceding tables, most C# type keywords from the left column are aliases for the corresponding .NET type. They're interchangeable. For example, the following declarations declare variables of the same type:
int a = 123;
System.Int32 b = 123;
The dynamic type is similar to object. The main differences are:
- Operations on a
dynamicexpression are bound at runtime, not at compile time. - You can't use
new dynamic(). - You can't derive a type from the
dynamictype.
The delegate keyword is a built-in reference type keyword that declares a type derived from System.Delegate. Unlike the other built-in type keywords, delegate isn't an alias for a specific .NET type. Instead, it declares custom types that derive from the abstract System.Delegate type. Similarly, dynamic represents runtime binding behavior rather than being a direct alias for a specific .NET type.
The void keyword represents the absence of a type. You use it as the return type of a method that doesn't return a value.
The C# language includes specialized rules for the System.Span<T> and System.ReadOnlySpan<T> types. These types aren't classified as built-in types, because there aren't C# keywords that correspond to these types. The C# language defines implicit conversions from array types and the string type to Span<T> and ReadOnlySpan<T>. These conversions integrate Span types into more natural programming scenarios. The following conversions are defined as implicit span conversions:
- From any single-dimensional array with element type
EtoSystem.Span<E> - From any single-dimensional array with element type
EtoSystem.ReadOnlySpan<U>, whenEhas covariance conversion or an identity conversion toU - From
System.Span<E>toSystem.ReadOnlySpan<U>, whenEhas a covariance conversion or an identity conversion toU - From
System.ReadOnlySpan<E>toSystem.ReadOnlySpan<U>, whenEhas a covariance conversion or an identity conversion toU - From
stringtoSystem.ReadOnlySpan<char>
The compiler never ignores any user defined conversion where an applicable implicit span conversion exists. Implicit span conversions can be applied to the first argument of extension methods, the parameter with the this modifier. Implicit span conversions aren't considered for method group conversions.