Простые целые числа nint
и nuint
, написанные на IL, вероятно, уступают место правильной поддержке компилятора. Полностью функциональный.
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 С# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | int | Н/Д | Н/Д | Да | Н/Д |
op_Implicit | uint | Н/Д | Н/Д | Н/Д | Да |
op_Explicit | long | Н/Д | Н/Д | Да | Н/Д |
op_Explicit | ulong | Н/Д | Н/Д | Н/Д | Да |
Имя | К | IntPtr C# | UIntPtr С# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Implicit | long | Н/Д | Н/Д | Да | Н/Д |
op_Implicit | ulong | Н/Д | Н/Д | Н/Д | Да |
op_Explicit | int | Н/Д | Н/Д | Да | Н/Д |
op_Explicit | uint | Н/Д | Н/Д | Н/Д | Да |
Имя | Символ оператора C++ | IntPtr C# | UIntPtr С# | nint C# | nuint C# |
---|---|---|---|---|---|
op_Decrement | -- 1 | Н/Д | Н/Д | Да | Да |
op_Increment | ++ 1 | Н/Д | Н/Д | Да | Да |
op_UnaryNegation | - (унарный) | Н/Д | Н/Д | Да | Да |
op_UnaryPlus | + (унарный) | Н/Д | Н/Д | Да | Да |
op_LogicalNot | ! | Н/Д | Н/Д | Н/Д | Н/Д |
оп_True | НД 2 | Н/Д | Н/Д | Н/Д | Н/Д |
op_False | НД 2 | Н/Д | Н/Д | Н/Д | Н/Д |
op_AddressOf | & (унарный) | Н/Д | Н/Д | Н/Д | Н/Д |
op_OnesComplement | ~ | Н/Д | Н/Д | Да | Да |
op_PointerDereference | * (унарный) | Н/Д | Н/Д | Н/Д | Н/Д |
1 С точки зрения чистого C++ способ написания этих функций для CLI отличается в одном очень важном аспекте. В C++ эти методы должны напрямую увеличивать или уменьшать свой операнд, тогда как в CLI они не должны; вместо этого они просто возвращают значение своего операнда +/- 1, если это необходимо, без изменения своего операнда. Операнд должен увеличиваться или уменьшаться компилятором, который генерирует код для оператора ++/--, отдельно от вызова этих методов.
2 Операторы op_True и op_False не существуют в C++. Они предназначены для поддержки логических типов с тремя состояниями, например тех, которые используются в языках баз данных.
В таблице ниже показаны типы, которые можно использовать вместе с типом в заголовке для данного бинарного оператора. По умолчанию это тип слева или справа от выражения (бинарный оператор). Однако в некоторых случаях оператор может быть доступен только для типа на определенной стороне выражения, где (R)
означает «только справа».
Имя | Символ оператора C++ | IntPtr C# | UIntPtr С# | 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 | * | Н/Д | Н/Д | 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 | Н/Д (= не то же самое) | Н/Д | Н/Д | Н/Д | Н/Д |
op_LeftShift | << | Н/Д | Н/Д | nint , IntPtr , int (R) | nuint , UIntPtr , uint (R) |
op_RightShift | >> | Н/Д | Н/Д | 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_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 | Не определено | Н/Д | Н/Д | Н/Д | Н/Д |
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_Comma | , | Н/Д (Н/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 >