IL로 작성된 간단한 nint 및 nuint 기본 정수는 아마도 적절한 컴파일러 지원에 이어 두 번째로 좋습니다. 완벽하게 기능합니다.
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 로/부터nuint 와의 UIntPtr 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 op_True 및 op_False 연산자는 C++에 존재하지 않습니다. 데이터베이스 언어에 사용되는 것과 같은 삼상태 부울 유형을 지원하기 위해 제공됩니다.
아래 표는 주어진 이항 연산자에 대해 헤더의 유형과 함께 사용할 수 있는 유형을 보여줍니다. 기본적으로 이는 표현식의 왼쪽 또는 오른쪽 유형(이항 연산자)에 대한 것입니다. 그러나 어떤 경우에는 표현식의 특정 측면에서만 연산자를 사용할 수 있습니다. 여기서 (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_Modulus | % | 해당 없음 | 해당 없음 | 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_LeftShift | << | 해당 없음 | 해당 없음 | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
| op_RightShift | >> | 해당 없음 | 해당 없음 | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
| op_SignedRightShift | N/D | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
| op_UnsignedRightShift | N/D | 해당 없음 | 해당 없음 | 해당 없음 | 해당 없음 |
| op_Equality | == | IntPtr | UIntPtr | nint , IntPtr , int , long | nuint , UIntPtr , uint , ulong |
| op_보다 큼 | > | 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 | -> | 해당 없음(N/OC#) | 해당 없음(N/OC#) | 해당 없음(N/OC#) | 해당 없음(N/OC#) |
| op_RightShift할당 | >>= | 해당 없음(N/OC#) | 해당 없음(N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
| op_MultiplicationAssignment | *= | 해당 없음(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_LeftShift할당 | <<= | 해당 없음(N/OC#) | 해당 없음(N/OC#) | nint , IntPtr , int | nuint , UIntPtr , uint TODO |
| op_Modulus할당 | %= | 해당 없음(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 >