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 >