NativeInts
1.0.0
用 IL 寫的簡單的nint
和nuint
本機整數可能僅次於正確的編譯器支援。功能齊全。
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
與nint
/ nuint
基於:
除了支援隱式轉換之外:
IntPtr
與nint
之間的轉換UIntPtr
到/從nuint
與IntPtr
/ UIntPtr
的可用轉換相比,支援以下轉換。
姓名 | 從 | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_隱式 | int | 不適用 | 不適用 | 是的 | 不適用 |
op_隱式 | uint | 不適用 | 不適用 | 不適用 | 是的 |
op_Explicit | long | 不適用 | 不適用 | 是的 | 不適用 |
op_Explicit | ulong | 不適用 | 不適用 | 不適用 | 是的 |
姓名 | 到 | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_隱式 | long | 不適用 | 不適用 | 是的 | 不適用 |
op_隱式 | ulong | 不適用 | 不適用 | 不適用 | 是的 |
op_Explicit | int | 不適用 | 不適用 | 是的 | 不適用 |
op_Explicit | uint | 不適用 | 不適用 | 不適用 | 是的 |
姓名 | C++ 運算符符號 | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
op_減量 | -- 1 | 不適用 | 不適用 | 是的 | 是的 |
op_增量 | ++ 1 | 不適用 | 不適用 | 是的 | 是的 |
op_UnaryNegation | -(一元) | 不適用 | 不適用 | 是的 | 是的 |
op_UnaryPlus | +(一元) | 不適用 | 不適用 | 是的 | 是的 |
op_LogicalNot | ! | 不適用 | 不適用 | 不適用 | 不適用 |
op_True | ND 2 | 不適用 | 不適用 | 不適用 | 不適用 |
op_False | ND 2 | 不適用 | 不適用 | 不適用 | 不適用 |
op_AddressOf | &(一元) | 不適用 | 不適用 | 不適用 | 不適用 |
op_Ones 補碼 | 〜 | 不適用 | 不適用 | 是的 | 是的 |
op_PointerDereference | *(一元) | 不適用 | 不適用 | 不適用 | 不適用 |
1從純 C++ 的角度來看,為 CLI 編寫這些函數的方式在一個非常重要的方面有所不同。在 C++ 中,這些方法必須直接遞增或遞減其操作數,而在 CLI 中則不能;相反,它們只是根據需要傳回其操作數的值 +/- 1,而不修改其操作數。運算元必須由產生 ++/-- 運算子程式碼的編譯器遞增或遞減,與這些方法的呼叫分開。
2 C++ 中不存在 op_True 和 op_False 運算子。提供它們是為了支援三態布林類型,例如資料庫語言中使用的類型。
下表顯示了可以與給定二元運算子的標頭中的類型一起使用的類型。預設情況下,這適用於表達式左側或右側的類型(二元運算子)。但是,在某些情況下,運算子可能僅可用於表達式特定一側的類型,其中(R)
表示「僅右側」。
姓名 | C++ 運算符符號 | IntPtr C# | UIntPtr C# | nint C# | nuint C# |
---|---|---|---|---|---|
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_Division | / | 不適用 | 不適用 | 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_按位與 | & | 不適用 | 不適用 | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
op_按位或 | | | 不適用 | 不適用 | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
op_LogicalAnd | && | 不適用 | 不適用 | 不適用 | 不適用 |
邏輯或運算 | || | 不適用 | 不適用 | 不適用 | 不適用 |
操作分配 | N/D(= 不同) | 不適用 | 不適用 | 不適用 | 不適用 |
op_LeftShift | << | 不適用 | 不適用 | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
op_右移 | >> | 不適用 | 不適用 | nint 、 IntPtr 、 int (R) | nuint 、 UIntPtr 、 uint (R) |
op_SignedRightShift | 不適用/不適用 | 不適用 | 不適用 | 不適用 | 不適用 |
op_UnsignedRightShift | 不適用/不適用 | 不適用 | 不適用 | 不適用 | 不適用 |
op_平等 | == | IntPtr | UIntPtr | nint 、 IntPtr 、 int 、 long | nuint 、 UIntPtr 、 uint 、 ulong |
op_GreaterThan | > | IntPtr | UIntPtr | nint 、 IntPtr 、 int 、 long | nuint 、 UIntPtr 、 uint 、 ulong |
op_小於 | < | 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_小於或等於 | <= | IntPtr | UIntPtr | nint 、 IntPtr 、 int 、 long | nuint 、 UIntPtr 、 uint 、 ulong |
op_UnsignedRightShiftAssignment | 未定義 | 不適用 | 不適用 | 不適用 | 不適用 |
op_MemberSelection | -> | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) |
op_RightShiftAssignment | >>= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_乘法賦值 | *= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_PointerToMemberSelection | ->* | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) |
op_SubtractionAssignment | -= | int | int | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_ExclusiveOrAssignment | ^= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_LeftShiftAssignment | <<= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_ModulusAssignment | %= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_AdditionAssignment | += | int | int | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_BitwiseAndAssignment | &= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_BitwiseOrAssignment | |= | 不適用 (N/OC#) | 不適用 (N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
op_逗號 | , | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) | 不適用 (N/OC#) |
op_DivisionAssignment | /= | 不適用 (N/OC#) | 不適用 (N/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 >