Los enteros nativos nint
y nuint
sencillos, escritos en IL, probablemente son los segundos mejores después del soporte adecuado del compilador. Totalmente funcional.
DotNetCross.NativeInts
https://www.nuget.org/packages/DotNetCross.NativeInts
nint
API public struct nint : IEquatable < nint > , IComparable < nint >
{
public static readonly nint Zero ;
public IntPtr Value ;
public nint ( IntPtr value ) ;
public nint ( int value ) ;
public nint ( long value ) ;
public int CompareTo ( nint other ) ;
public override bool Equals ( object obj ) ;
public bool Equals ( nint other ) ;
public override int GetHashCode ( ) ;
public override string ToString ( ) ;
public static nint operator + ( nint value ) ;
public static nint operator + ( nint l , nint r ) ;
public static nint operator + ( nint l , int r ) ;
public static nint operator + ( int l , nint r ) ;
public static nint operator - ( nint value ) ;
public static nint operator - ( nint l , int r ) ;
public static nint operator - ( nint l , nint r ) ;
public static nint operator - ( int l , nint r ) ;
public static nint operator ~ ( nint value ) ;
public static nint operator ++ ( nint value ) ;
public static nint operator -- ( nint value ) ;
public static nint operator * ( nint l , nint r ) ;
public static nint operator * ( nint l , int r ) ;
public static nint operator / ( nint l , int r ) ;
public static nint operator / ( nint l , nint r ) ;
public static nint operator % ( nint l , nint r ) ;
public static nint operator % ( nint l , int r ) ;
public static nint operator & ( nint l , int r ) ;
public static nint operator & ( nint l , nint r ) ;
public static nint operator | ( nint l , nint r ) ;
public static nint operator | ( nint l , int r ) ;
public static nint operator ^ ( nint l , nint r ) ;
public static nint operator ^ ( nint l , int r ) ;
public static nint operator << ( nint l , nint r ) ;
public static nint operator << ( nint l , int r ) ;
public static nint operator >> ( nint l , nint r ) ;
public static nint operator >> ( nint l , int r ) ;
public static bool operator == ( IntPtr l , nint r ) ;
public static bool operator == ( nint l , IntPtr r ) ;
public static bool operator == ( nint l , long r ) ;
public static bool operator == ( long l , nint r ) ;
public static bool operator == ( nint l , int r ) ;
public static bool operator == ( nint l , nint r ) ;
public static bool operator == ( int l , nint r ) ;
public static bool operator != ( IntPtr l , nint r ) ;
public static bool operator != ( long l , nint r ) ;
public static bool operator != ( nint l , IntPtr r ) ;
public static bool operator != ( nint l , long r ) ;
public static bool operator != ( int l , nint r ) ;
public static bool operator != ( nint l , int r ) ;
public static bool operator != ( nint l , nint r ) ;
public static bool operator < ( IntPtr l , nint r ) ;
public static bool operator < ( nint l , IntPtr r ) ;
public static bool operator < ( long l , nint r ) ;
public static bool operator < ( nint l , long r ) ;
public static bool operator < ( int l , nint r ) ;
public static bool operator < ( nint l , nint r ) ;
public static bool operator < ( nint l , int r ) ;
public static bool operator > ( IntPtr l , nint r ) ;
public static bool operator > ( long l , nint r ) ;
public static bool operator > ( nint l , long r ) ;
public static bool operator > ( int l , nint r ) ;
public static bool operator > ( nint l , int r ) ;
public static bool operator > ( nint l , nint r ) ;
public static bool operator > ( nint l , IntPtr r ) ;
public static bool operator <= ( nint l , int r ) ;
public static bool operator <= ( IntPtr l , nint r ) ;
public static bool operator <= ( nint l , IntPtr r ) ;
public static bool operator <= ( long l , nint r ) ;
public static bool operator <= ( nint l , long r ) ;
public static bool operator <= ( int l , nint r ) ;
public static bool operator <= ( nint l , nint r ) ;
public static bool operator >= ( nint l , nint r ) ;
public static bool operator >= ( nint l , IntPtr r ) ;
public static bool operator >= ( long l , nint r ) ;
public static bool operator >= ( nint l , long r ) ;
public static bool operator >= ( int l , nint r ) ;
public static bool operator >= ( nint l , int r ) ;
public static bool operator >= ( IntPtr l , nint r ) ;
public static implicit operator long ( nint value ) ;
public static implicit operator IntPtr ( nint value ) ;
public static implicit operator nint ( int value ) ;
public static implicit operator nint ( IntPtr value ) ;
public static explicit operator nint ( long value ) ;
public static explicit operator int ( nint value ) ;
}
nuint
public struct nuint : IEquatable < nuint > , IComparable < nuint >
{
public static readonly nuint Zero ;
public UIntPtr Value ;
public nuint ( UIntPtr value ) ;
public nuint ( uint value ) ;
public nuint ( ulong value ) ;
public int CompareTo ( nuint other ) ;
public override bool Equals ( object obj ) ;
public bool Equals ( nuint other ) ;
public override int GetHashCode ( ) ;
public override string ToString ( ) ;
public static nuint operator + ( nuint value ) ;
public static nuint operator + ( nuint l , nuint r ) ;
public static nuint operator + ( nuint l , uint r ) ;
public static nuint operator + ( uint l , nuint r ) ;
public static nuint operator - ( nuint l , uint r ) ;
public static nuint operator - ( nuint l , nuint r ) ;
public static nuint operator - ( uint l , nuint r ) ;
public static nuint operator ~ ( nuint value ) ;
public static nuint operator ++ ( nuint value ) ;
public static nuint operator -- ( nuint value ) ;
public static nuint operator * ( nuint l , nuint r ) ;
public static nuint operator * ( nuint l , uint r ) ;
public static nuint operator / ( nuint l , nuint r ) ;
public static nuint operator / ( nuint l , uint r ) ;
public static nuint operator % ( nuint l , nuint r ) ;
public static nuint operator % ( nuint l , uint r ) ;
public static nuint operator & ( nuint l , uint r ) ;
public static nuint operator & ( nuint l , nuint r ) ;
public static nuint operator | ( nuint l , uint r ) ;
public static nuint operator | ( nuint l , nuint r ) ;
public static nuint operator ^ ( nuint l , uint r ) ;
public static nuint operator ^ ( nuint l , nuint r ) ;
public static nuint operator << ( nuint l , nuint r ) ;
public static nuint operator << ( nuint l , uint r ) ;
public static nuint operator >> ( nuint l , nuint r ) ;
public static nuint operator >> ( nuint l , uint r ) ;
public static bool operator == ( nuint l , UIntPtr r ) ;
public static bool operator == ( UIntPtr l , nuint r ) ;
public static bool operator == ( nuint l , ulong r ) ;
public static bool operator == ( ulong l , nuint r ) ;
public static bool operator == ( nuint l , uint r ) ;
public static bool operator == ( nuint l , nuint r ) ;
public static bool operator == ( uint l , nuint r ) ;
public static bool operator != ( UIntPtr l , nuint r ) ;
public static bool operator != ( ulong l , nuint r ) ;
public static bool operator != ( nuint l , UIntPtr r ) ;
public static bool operator != ( nuint l , ulong r ) ;
public static bool operator != ( uint l , nuint r ) ;
public static bool operator != ( nuint l , uint r ) ;
public static bool operator != ( nuint l , nuint r ) ;
public static bool operator < ( UIntPtr l , nuint r ) ;
public static bool operator < ( nuint l , UIntPtr r ) ;
public static bool operator < ( ulong l , nuint r ) ;
public static bool operator < ( nuint l , ulong r ) ;
public static bool operator < ( uint l , nuint r ) ;
public static bool operator < ( nuint l , nuint r ) ;
public static bool operator < ( nuint l , uint r ) ;
public static bool operator > ( UIntPtr l , nuint r ) ;
public static bool operator > ( ulong l , nuint r ) ;
public static bool operator > ( nuint l , ulong r ) ;
public static bool operator > ( uint l , nuint r ) ;
public static bool operator > ( nuint l , uint r ) ;
public static bool operator > ( nuint l , nuint r ) ;
public static bool operator > ( nuint l , UIntPtr r ) ;
public static bool operator <= ( nuint l , uint r ) ;
public static bool operator <= ( UIntPtr l , nuint r ) ;
public static bool operator <= ( nuint l , UIntPtr r ) ;
public static bool operator <= ( ulong l , nuint r ) ;
public static bool operator <= ( nuint l , ulong r ) ;
public static bool operator <= ( uint l , nuint r ) ;
public static bool operator <= ( nuint l , nuint r ) ;
public static bool operator >= ( nuint l , nuint r ) ;
public static bool operator >= ( nuint l , UIntPtr r ) ;
public static bool operator >= ( ulong l , nuint r ) ;
public static bool operator >= ( nuint l , ulong r ) ;
public static bool operator >= ( uint l , nuint r ) ;
public static bool operator >= ( nuint l , uint r ) ;
public static bool operator >= ( UIntPtr l , nuint r ) ;
public static implicit operator ulong ( nuint value ) ;
public static implicit operator UIntPtr ( nuint value ) ;
public static implicit operator nuint ( uint value ) ;
public static implicit operator nuint ( UIntPtr value ) ;
public static explicit operator nuint ( ulong value ) ;
public static explicit operator uint ( nuint value ) ;
}
IntPtr
/ UIntPtr
vs nint
/ nuint
Residencia en:
Además de admitir la conversión implícita para:
IntPtr
hacia/desde nint
UIntPtr
hacia/desde nuint
Se admiten las siguientes conversiones en comparación con las conversiones disponibles para IntPtr
/ UIntPtr
.
Nombre | De | IntPtr C# | UIntPtr # | nint C# | nuint C# |
---|---|---|---|---|---|
op_implícito | int | N / A | N / A | Sí | N / A |
op_implícito | uint | N / A | N / A | N / A | Sí |
op_explícito | long | N / A | N / A | Sí | N / A |
op_explícito | ulong | N / A | N / A | N / A | Sí |
Nombre | A | IntPtr C# | UIntPtr # | nint C# | nuint C# |
---|---|---|---|---|---|
op_implícito | long | N / A | N / A | Sí | N / A |
op_implícito | ulong | N / A | N / A | N / A | Sí |
op_explícito | int | N / A | N / A | Sí | N / A |
op_explícito | uint | N / A | N / A | N / A | Sí |
Nombre | Símbolo del operador C++ | IntPtr C# | UIntPtr # | nint C# | nuint C# |
---|---|---|---|---|---|
op_Decremento | -- 1 | N / A | N / A | Sí | Sí |
op_Incremento | ++ 1 | N / A | N / A | Sí | Sí |
op_UnaryNegation | - (unario) | N / A | N / A | Sí | Sí |
op_UnaryPlus | + (unario) | N / A | N / A | Sí | Sí |
op_LogicalNot | ! | N / A | N / A | N / A | N / A |
op_verdadero | nd 2 | N / A | N / A | N / A | N / A |
op_False | nd 2 | N / A | N / A | N / A | N / A |
op_AddressOf | & (unario) | N / A | N / A | N / A | N / A |
op_OnesComplement | ~ | N / A | N / A | Sí | Sí |
op_PointerDereference | * (unario) | N / A | N / A | N / A | N / A |
1 Desde un punto de vista puro de C++, la forma en que se deben escribir estas funciones para la CLI difiere en un aspecto muy importante. En C++, estos métodos deben incrementar o disminuir su operando directamente, mientras que en CLI no deben hacerlo; en cambio, simplemente devuelven el valor de su operando +/- 1, según corresponda, sin modificar su operando. El compilador que genera el código para el operador ++/-- debe incrementar o disminuir el operando, independientemente de la llamada a estos métodos.
2 Los operadores op_True y op_False no existen en C++. Se proporcionan para admitir tipos booleanos triestados, como los que se utilizan en los lenguajes de bases de datos.
La siguiente tabla muestra los tipos que se pueden usar junto con el tipo en el encabezado para un operador binario determinado. De forma predeterminada, esto es para el tipo en el lado izquierdo o derecho de la expresión (operador binario). Sin embargo, en algunos casos, es posible que un operador solo esté disponible para un tipo en un lado específico de la expresión, donde (R)
significa "solo derecho".
Nombre | Símbolo del operador C++ | IntPtr C# | UIntPtr # | nint C# | nuint C# |
---|---|---|---|---|---|
op_Adición | + | int (R) | int (R) | nint , IntPtr , int | nuint , UIntPtr , uint |
op_Resta | - | int (R) | int (R) | nint , IntPtr , int | nuint , UIntPtr , uint |
op_Multiplicar | * | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
división_op | / | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
módulo_op | % | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_ExclusiveOr | ^ | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_BitwiseY | & | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_BitwiseOr | | | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_LogicalAnd | && | N / A | N / A | N / A | N / A |
op_LogicalOr | || | N / A | N / A | N / A | N / A |
op_Asignar | N/D (= no es lo mismo) | N / A | N / A | N / A | N / A |
op_LeftShift | << | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_RightShift | >> | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_SignedRightShift | DAKOTA DEL NORTE | N / A | N / A | N / A | N / A |
op_UnsignedRightShift | DAKOTA DEL NORTE | N / A | N / A | N / A | N / A |
op_Igualdad | == | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_mayorque | > | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_MenosThan | < | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_Desigualdad | != | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_MayorThanOrEqual | >= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_LessThanOrEqual | <= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_UnsignedRightShiftAssignment | No definido | N / A | N / A | N / A | N / A |
op_MemberSelection | -> | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) |
op_RightShiftAssignment | >>= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_Asignación de multiplicación | *= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_PointerToMemberSelection | ->* | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) |
op_SubtractionAssignment | -= | int | int | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_ExclusiveOrAssignment | ^= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_LeftShiftAssignment | <<= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_ModulusAssignment | %= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_AdditionAssignment | += | int | int | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_BitwiseAndAssignment | &= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_BitwiseOrAssignment | |= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_coma | , | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) | N/A (N/OC#) |
op_DivisionAssignment | /= | N/A (N/OC#) | N/A (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
N/A
= No disponibleN/O
= No sobrecargable, pero para operadores de asignación utilizables disponibles a través del operador estático binario, por ejemplo, +=
está disponible a través de +
. Los siguientes métodos tienen la misma implementación o reenvían a la implementación IntPtr
/ UIntPtr
equivalente.
public override bool Equals ( object obj )
public override int GetHashCode ( )
public override string ToString ( )
Se han implementado las siguientes interfaces para el tipo nint
o nuint
dado:
IEquatable < T >
IComparable < T >