Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.
Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar, ilgili dil tasarım toplantısı (LDM) notlarındakaydedilir.
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/6065
Özet
Bu, nint/ türlerinin nuintSystem.IntPtr/temel alınan türlerden farklı olduğu ilk yerel tamsayılar özelliğinde (System.UIntPtr) yapılan bir düzeltmedir.
Kısacası, nint/nuintSystem.IntPtrile ilgili olarak / için yaptığımız gibi System.UIntPtrintSystem.Int32basit türler olarak ele alıyoruz.
System.Runtime.CompilerServices.RuntimeFeature.NumericIntPtr çalışma zamanı özellik bayrağı bu yeni davranışı tetikler.
Tasarım
8.3.5 Basit türler
C# basit türler olarak adlandırılan önceden tanımlanmış struct türleri kümesi sağlar. Basit türler anahtar sözcükler aracılığıyla tanımlanır, ancak bu anahtar sözcükler yalnızca aşağıdaki tabloda açıklandığı gibi struct ad alanında önceden tanımlanmış System türleri için diğer adlardır.
| Anahtar Sözcük | Adlandırılmış tür |
|---|---|
sbyte |
System.SByte |
byte |
System.Byte |
short |
System.Int16 |
ushort |
System.UInt16 |
int |
System.Int32 |
uint |
System.UInt32 |
nint |
System.IntPtr |
nuint |
System.UIntPtr |
long |
System.Int64 |
ulong |
System.UInt64 |
char |
System.Char |
float |
System.Single |
double |
System.Double |
bool |
System.Boolean |
decimal |
System.Decimal |
[...]
8.3.6 Integral türleri
C# on bir integral türünü destekler: sbyte, byte, short, ushort, int, uint, nint, nuint, long, ulongve char. [...]
8.8 Yönetilmeyen türler
Başka bir deyişle, unmanaged_type aşağıdakilerden biridir:
-
sbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,char,float,double,decimalveyabool. - Herhangi bir enum_type.
- Kullanıcı tanımlı, oluşturulmuş tür olmayan ve sadece unmanaged_typealanlarını içeren struct_type.
- Güvenli olmayan kodda, herhangi bir pointer_tipiolabilir.
10.2.3 Örtük sayısal dönüştürmeler
Örtük sayısal dönüştürmeler şunlardır:
-
sbyteshort,int,nint,long,float,doubleveyadecimal. -
byte'denshort,ushort,int,uint,nint,nuint,long,ulong,float,doubleveyadecimal. -
short'denint,nint,long,float,doubleveyadecimal. -
ushort,int,uint, ,nint,nuint,,long,ulong,float,doubleveyadecimal. -
int'dannint'e,long'ye,float'e,double'e veyadecimal'e. -
uint'dennuint,long,ulong,float,doubleveyadecimal. -
,
nint'denlong,float,doubleveyadecimal. -
,
nuint'denulong,float,doubleveyadecimal. -
long'denfloat,doubleveyadecimal. -
ulong'denfloat,doubleveyadecimal. -
char'denushort,int,uint,nint,nuint,long,ulong,float,doubleveyadecimal. -
float'dandouble'e
[...]
10.2.11 Örtük sabit ifade dönüştürmeleri
Örtük sabit ifade dönüştürmesi aşağıdaki dönüştürmelere izin verir:
-
türündeki bir
int,sbytedeğeri hedef türün aralığında olması koşuluylabyte,short,ushort,uint,nint,nuintveya türüne dönüştürülebilir. [...]
10.3.2 Açık sayısal dönüştürmeler
Açık sayısal dönüştürmeler, örtük sayısal dönüştürmenin henüz mevcut olmadığı bir numeric_type'den başka bir numeric_type'e yapılan dönüştürmelerdir.
-
sbyte'denbyte,ushort,uint,nuint,ulongveyachar. -
byteilesbyteveyachar. -
shortsbyte,byte,ushort,uint,nuint,ulongveyachar. -
ushort'dansbyte,byte,shortveyachar. -
int'densbyte,byte,short,ushort,uint,nuint,ulongveyachar. -
uintsbyte,byte,short,ushort,int,nintveyachar. -
long'densbyte,byte,short,ushort,int,uint,nint,nuint,ulongveyachar. -
nint'densbyte,byte,short,ushort,int,uint,nuint,ulongveyachar. -
nuint'densbyte,byte,short,ushort,int,uint,nint,longveyachar. -
ulong'densbyte,byte,short,ushort,int,uint,nint,nuint,longveyachar. -
char'densbyte,byteveyashort. -
float'densbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,charveyadecimal. -
double'densbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,char,floatveyadecimal. -
decimal'densbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,char,floatveyadouble.
[...]
10.3.3 Açık numaralandırma dönüştürmeleri
Açık numaralandırma dönüştürmeleri şunlardır:
-
sbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,char,float,doubleya dadecimalherhangi bir enum_type. - herhangi bir enum_type,
sbyte,byte,short,ushort,int,uint,nint,nuint,long,ulong,char,float,doubleveyadecimal. - Herhangi bir enum_type'den herhangi bir diğer enum_type'e.
12.6.4.7 Daha iyi dönüştürme hedefi
T₁ ve T₂iki tür verildiğinde, aşağıdakilerden biri geçerli olduğunda, T₁'ye göre daha iyi bir dönüştürme hedefi olarak 'dır.
-
T₁'danT₂'ye örtük dönüştürme mevcut veT₂'danT₁'e örtük dönüştürme yok -
T₁,Task<S₁>'dir,T₂,Task<S₂>'dir veS₁,S₂'ten daha iyi bir dönüştürme hedefidir. -
T₁,S₁imzalı bir tam sayı türü olduğundaS₁?veyaS₁; veT₂,S₂işaretsiz bir integral türü olduğundaS₂?veyaS₂'dır. Özellikle: [...]
12.8.12 Öğeye erişim
[...] argument_list ifade sayısı, array_typederecesiyle aynı olacaktır ve her ifade int, uint, nint, nuint, longveya ulong, türünde olmalıdır veya bu türlerden birine veya daha fazlasına örtük olarak dönüştürülebilir olmalıdır.
11.8.12.2 Dizi erişimi
[...] argument_list ifade sayısı, array_typederecesiyle aynı olacaktır ve her ifade int, uint, nint, nuint, longveya ulong, türünde olmalıdır veya bu türlerden birine veya daha fazlasına örtük olarak dönüştürülebilir olmalıdır.
[...] form P[A]bir dizi erişiminin çalışma zamanı işlemesi; burada P bir primary_no_array_creation_expression olan array_type ve A bir argument_listise aşağıdaki adımlardan oluşur: [...]
-
argument_list dizin ifadeleri soldan sağa doğru sırayla değerlendirilir. Her dizin ifadesinin değerlendirilmesinin ardından, aşağıdaki türlerden birine örtük bir dönüştürme gerçekleştirilir:
int,uint,nint,nuint,long,ulong. Bu listede örtük dönüştürmenin bulunduğu ilk tür seçilir. [...]
12.8.16 Son ek artırma ve azaltma işleçleri
Belirli bir işleç uygulamasını seçmek için birli işleç aşırı yükleme çözümlemesi uygulanır. Önceden tanımlanmış ++ ve -- işleçleri şu türler için vardır: sbyte, byte, short, ushort, int, uint, nint, nuint,long, ulong, char, float, double, decimalve herhangi bir sabit listesi türü.
12.9.2 Tekli artı operatörü
Önceden tanımlanmış birli artı işleçleri şunlardır:
...
nint operator +(nint x);
nuint operator +(nuint x);
12.9.3 Tekil eksi işleci
Önceden tanımlanmış birli eksi işleçleri şunlardır:
Tamsayı olumsuzlaması:
... nint operator –(nint x);
12.8.16 Son ek artırma ve azaltma işleçleri
Aşağıdaki türler için önceden tanımlanmış ++ ve -- işleçleri vardır: sbyte, byte, short, ushort, int, uint, nint, nuint, long, ulong, char, float, double, decimalve herhangi bir sabit listesi türü.
11.7.19 Varsayılan değer ifadeleri
Ayrıca, tür şu değer türlerinden biriyse default_value_expression sabit bir ifadedir: sbyte, byte, short, ushort, int, uint, nint, nuint, long, ulong, char, float, double, decimal, bool, veya herhangi bir numaralandırma türü.
12.9.5 Bit düzeyinde tamamlama işleci
Önceden tanımlanmış bit düzeyinde tamamlayıcı işleçleri şunlardır:
...
nint operator ~(nint x);
nuint operator ~(nuint x);
12.9.6 Ön ek artırma ve azaltma işleçleri
Aşağıdaki türler için önceden tanımlanmış ++ ve -- işleçleri vardır: sbyte, byte, short, ushort, int, uint, nint, nuint, long, ulong, char, float, double, decimalve herhangi bir sabit listesi türü.
12.10 Aritmetik işleçler
12.10.2 Çarpma işleci
Önceden tanımlanmış çarpma işleçleri aşağıda listelenmiştir. Tüm işleçler birlikte x ve y'in çarpımını hesaplar.
Tamsayı çarpması:
... nint operator *(nint x, nint y); nuint operator *(nuint x, nuint y);
12.10.3 Bölme işleci
Önceden tanımlanmış bölme işleçleri aşağıda listelenmiştir. İşleçlerin tümü x ve ybölümlerini hesaplar.
Tamsayı bölme:
... nint operator /(nint x, nint y); nuint operator /(nuint x, nuint y);
12.10.4 Kalan işleci
Önceden tanımlanmış kalan operatörler aşağıda listelenmiştir. İşleçlerin tümü, x ile yarasındaki bölmenin geri kalanını hesaplar.
Kalan tamsayı:
... nint operator %(nint x, nint y); nuint operator %(nuint x, nuint y);
12.10.5 Toplama işleci
Tamsayı ekleme:
... nint operator +(nint x, nint y); nuint operator +(nuint x, nuint y);
12.10.6 Çıkarma işleci
Tamsayı çıkarma:
... nint operator –(nint x, nint y); nuint operator –(nuint x, nuint y);
12.11 Shift işleçleri
Önceden tanımlanmış vardiya işleçleri aşağıda listelenmiştir.
Sola kaydır:
... nint operator <<(nint x, int count); nuint operator <<(nuint x, int count);Sağa kaydır:
... nint operator >>(nint x, int count); nuint operator >>(nuint x, int count);>>operatörü, aşağıda açıklandığı şekilde hesaplanan bir miktar bit kadarx'i sağa kaydırır.xinttüründe olduğunda,nintveyalongdüşük sıralıxbitleri atılır, kalan bitler sağa kaydırılır vexnegatif değilse yüksek sıralı boş bit konumları sıfıra ayarlanır vexnegatifse bir olarak ayarlanır.xuinttüründe olduğunda,nuintveyaulong, düşük sıralıxbitleri atılır, kalan bitler sağa kaydırılır ve yüksek sıralı boş bit konumları sıfır olarak ayarlanır.İşaretsiz sağa kaydırma:
... nint operator >>>(nint x, int count); nuint operator >>>(nuint x, int count);
Önceden tanımlanmış işleçler için kaydıracak bit sayısı şu şekilde hesaplanır: [...]
-
xtürünintveyanuintolduğunda, vardiya sayısı 32 bit platformda düşük sıralı beş bitcountveya 64 bit platformda alt sıra altı bitcounttarafından verilir.
12.12 İlişkisel ve tür testi işleçleri
12.12.2 Tamsayı karşılaştırma işleçleri
Önceden tanımlanmış tamsayı karşılaştırma işleçleri şunlardır:
...
bool operator ==(nint x, nint y);
bool operator ==(nuint x, nuint y);
bool operator !=(nint x, nint y);
bool operator !=(nuint x, nuint y);
bool operator <(nint x, nint y);
bool operator <(nuint x, nuint y);
bool operator >(nint x, nint y);
bool operator >(nuint x, nuint y);
bool operator <=(nint x, nint y);
bool operator <=(nuint x, nuint y);
bool operator >=(nint x, nint y);
bool operator >=(nuint x, nuint y);
12.12 Mantıksal işleçler
12.12.2 Tamsayı mantıksal işleçleri
Önceden tanımlanmış tamsayı mantıksal işleçleri şunlardır:
...
nint operator &(nint x, nint y);
nuint operator &(nuint x, nuint y);
nint operator |(nint x, nint y);
nuint operator |(nuint x, nuint y);
nint operator ^(nint x, nint y);
nuint operator ^(nuint x, nuint y);
12.22 Sabit ifadeler
Sabit ifade bir değer türü veya başvuru türü olabilir. Sabit ifade bir değer türüyse, şu türlerden biri olmalıdır: sbyte, byte, short, ushort, int, uint, nint, nuint, long, ulong, char, float, double, decimal, bool, veya herhangi bir numaralandırma türü.
[...]
Örtük sabit ifade dönüştürme, sabit ifadenin değeri hedef türün aralığında olması koşuluyla, int türünde bir sabit ifadenin sbyte, byte, short, ushort, uint, nint, nuint, veya ulongdönüştürülmesini sağlar.
17.4 Dizi öğesi erişimi
Dizi öğelerine, formunun A[I₁, I₂, ..., Iₓ] ifadeleri kullanılarak erişilir; burada A bir dizi türünün ifadesidir ve her Iₑint, uint, nint, nuint,long, ulongtüründe bir ifadedir veya örtük olarak bu türlerden birine veya birden fazlasına dönüştürülebilir. Dizi elemanı erişiminin sonucu, dizinler tarafından seçilen dizi elemanı olan bir değişkendir.
23.5 İşaretçi dönüştürmeleri
23.5.1 Genel
[...]
Ayrıca, güvenli olmayan bir bağlamda, kullanılabilir açık dönüştürmeler kümesi aşağıdaki açık işaretçi dönüştürmelerini içerecek şekilde genişletilir:
- Herhangi bir pointer_type'dan herhangi bir diğer pointer_type'e.
-
sbyte,byte,short,ushort,int,uint, ,nint,nuint,,longveyaulong'dan herhangi birine pointer_type. - herhangi bir pointer_type,
sbyte,byte,short,ushort,int,uint,nint,nuint,longveyaulong.
23.6.4 İşaretçi öğesi erişimi
[...] P[E]formun işaretçi öğesi erişiminde, Pvoid*dışında bir işaretçi türünün ifadesi ve E örtük olarak int, uint, nint, nuint,longveya ulongdönüştürülebilen bir ifade olmalıdır.
23.6.7 İşaretçi aritmetiği
Güvenli olmayan bir bağlamda, + işleci ve – işleci void*dışındaki tüm işaretçi türlerinin değerlerine uygulanabilir. Bu nedenle, T*her işaretçi türü için aşağıdaki işleçler örtük olarak tanımlanır:
[...]
T* operator +(T* x, nint y);
T* operator +(T* x, nuint y);
T* operator +(nint x, T* y);
T* operator +(nuint x, T* y);
T* operator -(T* x, nint y);
T* operator -(T* x, nuint y);
Bir işaretçi türü P olan ifade T* ve türünde N ifadesi olan int, uint, nint, nuint,longveya ulongifadeleri verilen P + N ve N + P, T*tarafından belirtilen adrese N * sizeof(T) eklenmesiyle oluşan P türündeki işaretçi değerini hesaplar. Benzer şekilde, P – N ifadesi T*tarafından verilen adresten N * sizeof(T) çıkarılarak elde edilen P türündeki işaretçi değerini hesaplar.
Dikkat edilmesi gereken çeşitli noktalar
Hataya neden olan değişiklikler
Bu tasarımın ana etkilerinden biri, System.IntPtr ve System.UIntPtr'in bazı yerleşik operatörler (dönüştürmeler, tekil ve ikili) kazanmasıdır.
Bunlar checked işleçlerini içerir, bu da bu türlerdeki aşağıdaki işleçlerin taşma hatası vereceği anlamına gelir:
IntPtr + intIntPtr - intIntPtr -> intlong -> IntPtrvoid* -> IntPtr
Meta veri kodlama
Bu tasarım, nint ve nuint'in System.IntPtrkullanılmadan System.UIntPtr ve System.Runtime.CompilerServices.NativeIntegerAttributeolarak yayılması anlamına gelir.
Benzer şekilde, meta veriler yüklenirken NativeIntegerAttribute yoksayılabilir.
C# feature specifications