Les entiers natifs simples nint
et nuint
, écrits en IL, sont probablement le deuxième meilleur après la prise en charge appropriée du compilateur. Entièrement fonctionnel.
DotNetCross.NativeInts
https://www.nuget.org/packages/DotNetCross.NativeInts
nint
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
et nint
/ nuint
Basé sur:
En plus de prendre en charge la conversion implicite pour :
IntPtr
vers/depuis nint
UIntPtr
vers/depuis nuint
Les conversions suivantes sont prises en charge par rapport aux conversions disponibles pour IntPtr
/ UIntPtr
.
Nom | Depuis | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | int | N / A | N / A | Oui | N / A |
op_Implicit | uint | N / A | N / A | N / A | Oui |
op_Explicit | long | N / A | N / A | Oui | N / A |
op_Explicit | ulong | N / A | N / A | N / A | Oui |
Nom | À | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | long | N / A | N / A | Oui | N / A |
op_Implicit | ulong | N / A | N / A | N / A | Oui |
op_Explicit | int | N / A | N / A | Oui | N / A |
op_Explicit | uint | N / A | N / A | N / A | Oui |
Nom | Symbole de l'opérateur C++ | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Décrément | -- 1 | N / A | N / A | Oui | Oui |
op_Increment | ++ 1 | N / A | N / A | Oui | Oui |
op_UnaryNegation | - (unaire) | N / A | N / A | Oui | Oui |
op_UnaryPlus | + (unaire) | N / A | N / A | Oui | Oui |
op_LogicalNot | ! | N / A | N / A | N / A | N / A |
op_Vrai | ND2 | N / A | N / A | N / A | N / A |
op_Faux | ND2 | N / A | N / A | N / A | N / A |
op_AddressOf | & (unaire) | N / A | N / A | N / A | N / A |
op_OnesComplement | ~ | N / A | N / A | Oui | Oui |
op_PointerDereference | * (unaire) | N / A | N / A | N / A | N / A |
1 D'un point de vue purement C++, la manière dont il faut écrire ces fonctions pour la CLI diffère sur un aspect très important. En C++, ces méthodes doivent incrémenter ou décrémenter leur opérande directement, alors qu'en CLI, elles ne doivent pas le faire ; au lieu de cela, ils renvoient simplement la valeur de leur opérande +/- 1, le cas échéant, sans modifier leur opérande. L'opérande doit être incrémenté ou décrémenté par le compilateur qui génère le code pour l'opérateur ++/--, distinct de l'appel à ces méthodes.
2 Les opérateurs op_True et op_False n'existent pas en C++. Ils sont fournis pour prendre en charge les types booléens à trois états, tels que ceux utilisés dans les langages de bases de données.
Le tableau ci-dessous montre les types qui peuvent être utilisés avec le type dans l'en-tête pour un opérateur binaire donné. Par défaut, il s'agit du type situé à gauche ou à droite de l'expression (opérateur binaire). Cependant, dans certains cas, un opérateur peut n'être disponible que pour un type situé à un côté spécifique de l'expression, (R)
signifiant « droit uniquement ».
Nom | Symbole de l'opérateur C++ | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Addition | + | int (R) | int (R) | nint , IntPtr , int | nuint , UIntPtr , uint |
op_Soustraction | - | int (R) | int (R) | nint , IntPtr , int | nuint , UIntPtr , uint |
op_Multiply | * | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_Division | / | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_Module | % | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_ExclusiveOu | ^ | N / A | N / A | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_BitwiseAnd | & | 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_LogiqueEt | && | N / A | N / A | N / A | N / A |
op_LogiqueOu | || | N / A | N / A | N / A | N / A |
op_Assign | N/D (= n'est pas pareil) | 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 | S/D | N / A | N / A | N / A | N / A |
op_UnsignedRightShift | S/D | N / A | N / A | N / A | N / A |
op_Égalité | == | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_GreaterThan | > | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_MoinsThan | < | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_Inégalité | != | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_GreaterThanOrEqual | >= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_MoinsThanOrEqual | <= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_UnsignedRightShiftAssignment | Non défini | 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_MultiplicationAssignment | *= | 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_Comma | , | 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
= Non disponibleN/O
= Non surchargeable, mais pour les opérateurs d'affectation, disponible via un opérateur statique binaire, par exemple +=
est disponible via +
. Les méthodes suivantes ont la même implémentation ou sont transmises à l'implémentation IntPtr
/ UIntPtr
équivalente.
public override bool Equals ( object obj )
public override int GetHashCode ( )
public override string ToString ( )
Les interfaces suivantes ont été implémentées pour le type nint
ou nuint
donné :
IEquatable < T >
IComparable < T >