Einfache native nint
und nuint
Ganzzahlen, geschrieben in IL, wahrscheinlich das zweitbeste nach der richtigen Compiler-Unterstützung. Voll funktionsfähig.
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
-API 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
mit nint
/ nuint
Bezogen auf:
Neben der Unterstützung der impliziten Konvertierung für:
IntPtr
zu/von nint
UIntPtr
zu/von nuint
Die folgenden Konvertierungen werden im Vergleich zu den verfügbaren Konvertierungen für IntPtr
/ UIntPtr
unterstützt.
Name | Aus | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | int | N / A | N / A | Ja | N / A |
op_Implicit | uint | N / A | N / A | N / A | Ja |
op_Explicit | long | N / A | N / A | Ja | N / A |
op_Explicit | ulong | N / A | N / A | N / A | Ja |
Name | Zu | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | long | N / A | N / A | Ja | N / A |
op_Implicit | ulong | N / A | N / A | N / A | Ja |
op_Explicit | int | N / A | N / A | Ja | N / A |
op_Explicit | uint | N / A | N / A | N / A | Ja |
Name | C++-Operatorsymbol | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Dekrement | -- 1 | N / A | N / A | Ja | Ja |
op_Inkrement | ++ 1 | N / A | N / A | Ja | Ja |
op_UnaryNegation | - (unär) | N / A | N / A | Ja | Ja |
op_UnaryPlus | + (unär) | N / A | N / A | Ja | Ja |
op_LogicalNot | ! | N / A | N / A | N / A | N / A |
op_True | ND 2 | N / A | N / A | N / A | N / A |
op_False | ND 2 | N / A | N / A | N / A | N / A |
op_AddressOf | & (unär) | N / A | N / A | N / A | N / A |
op_OnesComplement | ~ | N / A | N / A | Ja | Ja |
op_PointerDereference | * (unär) | N / A | N / A | N / A | N / A |
1 Aus reiner C++-Sicht unterscheidet sich die Art und Weise, wie man diese Funktionen für die CLI schreiben muss, in einem sehr wichtigen Aspekt. In C++ müssen diese Methoden ihren Operanden direkt erhöhen oder verringern, während dies in CLI nicht zulässig ist. Stattdessen geben sie gegebenenfalls einfach den Wert ihres Operanden +/- 1 zurück, ohne ihren Operanden zu ändern. Der Operand muss vom Compiler, der den Code für den ++/---Operator generiert, unabhängig vom Aufruf dieser Methoden inkrementiert oder dekrementiert werden.
2 Die Operatoren op_True und op_False existieren in C++ nicht. Sie werden bereitgestellt, um boolesche Tristate-Typen zu unterstützen, wie sie beispielsweise in Datenbanksprachen verwendet werden.
Die folgende Tabelle zeigt die Typen, die zusammen mit dem Typ im Header für einen bestimmten Binäroperator verwendet werden können. Standardmäßig gilt dies für den Typ auf der linken oder rechten Seite des Ausdrucks (binärer Operator). In einigen Fällen ist ein Operator jedoch möglicherweise nur für einen Typ auf einer bestimmten Seite des Ausdrucks verfügbar, wobei (R)
„nur rechts“ bedeutet.
Name | C++-Operatorsymbol | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Addition | + | int (R) | int (R) | nint , IntPtr , int | nuint , UIntPtr , uint |
op_Subtraction | - | 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_Modulus | % | 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_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_LogicalAnd | && | N / A | N / A | N / A | N / A |
op_LogicalOr | || | N / A | N / A | N / A | N / A |
op_Assign | N/D (= ist nicht dasselbe) | 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 | N/D | N / A | N / A | N / A | N / A |
op_UnsignedRightShift | N/D | N / A | N / A | N / A | N / A |
op_Equality | == | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_GreaterThan | > | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_LessThan | < | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_Inequality | != | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_GreaterThanOrEqual | >= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_LessThanOrEqual | <= | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
op_UnsignedRightShiftAssignment | Nicht definiert | 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
= Nicht verfügbarN/O
= Nicht überladbar, aber für Zuweisungsoperatoren über den binären statischen Operator nutzbar, z. B. +=
ist über +
verfügbar. Die folgenden Methoden haben die gleiche oder leiten an die entsprechende IntPtr
/ UIntPtr
-Implementierung weiter.
public override bool Equals ( object obj )
public override int GetHashCode ( )
public override string ToString ( )
Die folgenden Schnittstellen wurden für den angegebenen Typ nint
oder nuint
implementiert:
IEquatable < T >
IComparable < T >