IL で書かれた単純なnintおよびnuintネイティブ整数は、おそらく適切なコンパイラ サポートに次いで 2 番目に優れています。完全に機能します。
DotNetCross.NativeIntshttps://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とnint / nuintの比較に基づく:
以下の暗黙的な変換をサポートするほかに、
IntPtr nint間のやり取りUIntPtrとnuint間のやり取りIntPtr / UIntPtrで利用可能な変換と比較して、次の変換がサポートされています。
| 名前 | から | IntPtr C# | UIntPtr C# | nint C# | nuint # |
|---|---|---|---|---|---|
| op_暗黙的 | int | 該当なし | 該当なし | はい | 該当なし |
| op_暗黙的 | uint | 該当なし | 該当なし | 該当なし | はい |
| op_明示的 | long | 該当なし | 該当なし | はい | 該当なし |
| op_明示的 | ulong | 該当なし | 該当なし | 該当なし | はい |
| 名前 | に | IntPtr C# | UIntPtr C# | nint C# | nuint # |
|---|---|---|---|---|---|
| op_暗黙的 | long | 該当なし | 該当なし | はい | 該当なし |
| op_暗黙的 | ulong | 該当なし | 該当なし | 該当なし | はい |
| op_明示的 | int | 該当なし | 該当なし | はい | 該当なし |
| op_明示的 | uint | 該当なし | 該当なし | 該当なし | はい |
| 名前 | C++ 演算子の記号 | IntPtr C# | UIntPtr C# | nint C# | nuint # |
|---|---|---|---|---|---|
| op_デクリメント | -- 1 | 該当なし | 該当なし | はい | はい |
| op_Increment | ++ 1 | 該当なし | 該当なし | はい | はい |
| op_UnaryNegation | - (単項) | 該当なし | 該当なし | はい | はい |
| op_UnaryPlus | + (単項) | 該当なし | 該当なし | はい | はい |
| op_LogicalNot | ! | 該当なし | 該当なし | 該当なし | 該当なし |
| op_True | ND2 | 該当なし | 該当なし | 該当なし | 該当なし |
| op_False | ND2 | 該当なし | 該当なし | 該当なし | 該当なし |
| op_アドレス | & (単項) | 該当なし | 該当なし | 該当なし | 該当なし |
| op_OnesComplement | ~ | 該当なし | 該当なし | はい | はい |
| op_PointerDereference | * (単項) | 該当なし | 該当なし | 該当なし | 該当なし |
1純粋な C++ の観点から見ると、CLI 用にこれらの関数を記述する方法は、非常に重要な点が 1 つ異なります。 C++ では、これらのメソッドはオペランドを直接インクリメントまたはデクリメントする必要がありますが、CLI ではそれはできません。代わりに、オペランドを変更せずに、必要に応じて単にオペランドの値 +/- 1 を返します。オペランドは、これらのメソッドの呼び出しとは別に、++/-- 演算子のコードを生成するコンパイラによってインクリメントまたはデクリメントされる必要があります。
2 op_True 演算子と op_False 演算子は C++ には存在しません。これらは、データベース言語で使用されるようなトライステート ブール型をサポートするために提供されています。
以下の表は、特定の二項演算子のヘッダーの型と一緒に使用できる型を示しています。デフォルトでは、これは式の左側または右側の型 (二項演算子) に対するものです。ただし、場合によっては、演算子は式の特定の側の型に対してのみ使用でき、 (R)は「右のみ」を意味します。
| 名前 | C++ 演算子の記号 | IntPtr C# | UIntPtr C# | nint C# | nuint # |
|---|---|---|---|---|---|
| op_追加 | + | int (R) | int (R) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint |
| op_減算 | - | int (R) | int (R) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint |
| op_乗算 | * | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_部門 | / | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_モジュラス | % | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_ExclusiveOr | ^ | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_BitwiseAnd | & | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_BitwiseOr | | | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_LogicalAnd | && | 該当なし | 該当なし | 該当なし | 該当なし |
| op_LogicalOr | || | 該当なし | 該当なし | 該当なし | 該当なし |
| op_Assign | N/D (= は同じではありません) | 該当なし | 該当なし | 該当なし | 該当なし |
| op_左シフト | << | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_右シフト | >> | 該当なし | 該当なし | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
| op_SignedRightShift | 該当なし | 該当なし | 該当なし | 該当なし | 該当なし |
| op_UnsignedRightShift | 該当なし | 該当なし | 該当なし | 該当なし | 該当なし |
| 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_不等式 | != | 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 | 未定義 | 該当なし | 該当なし | 該当なし | 該当なし |
| op_MemberSelection | -> | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) |
| op_RightShiftAssignment | >>= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_MultiplicationAssignment | *= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_PointerToMemberSelection | ->* | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) |
| op_SubtractionAssignment | -= | int | int | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_ExclusiveOrAssignment | ^= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_LeftShiftAssignment | <<= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_ModulusAssignment | %= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_AdditionAssignment | += | int | int | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_BitwiseAndAssignment | &= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_BitwiseOrAssignment | |= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
| op_カンマ | 、 | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) | 該当なし (OC#なし) |
| op_DivisionAssignment | /= | 該当なし (OC#なし) | 該当なし (OC#なし) | nint 、 IntPtr 、 int | nuint 、 UIntPtr 、 uint TODO |
N/A = 利用不可N/O = オーバーロード可能ではありませんが、代入演算子については二項静的演算子を介して使用できます。たとえば、 += +介して使用できます。次のメソッドは、同等のIntPtr / UIntPtr実装と同じか、同等の実装に転送されます。
public override bool Equals ( object obj )
public override int GetHashCode ( )
public override string ToString ( )次のインターフェイスは、指定された型nintまたはnuintに対して実装されています。
IEquatable < T >
IComparable < T >