6. Dönüştürmeler

Tür dönüştürme , farklı bir tür gerektiren bir bağlamda bir tür değeri kullanılırken gerçekleştirilir. Böyle bir dönüştürme otomatik olarak gerçekleşirse, örtülü dönüştürme olarak bilinir. (Bunun yaygın bir örneği, işlenenleri tarafından belirlenen değerlerden birini veya daha fazlasını dönüştürmesi gereken bazı işleçlerdir.) Kaynak değerin algısı korunarak, örneğin dönüştürülen bir sayanın duyarlığı kaybı yaşanmaması şartıyla örtülü dönüştürmeye izin verilir.

Tür dönüştürme işleci (yaklaşık 7.2.9) açık dönüştürmeye izin verir.

Dönüştürmeler aşağıda ele alınmıştır ve ek bilgiler ,6.19'daki her işleç açıklamasında gerekli şekilde sağlanmıştır.

Bir değerin zaten sahip olduğu türe açık olarak dönüştürmesi, bu değerde veya temsilde değişiklike neden olmaz.

Bir ifadenin değeri bir parametreye bağlıyken dönüştürmeyi teslim etmek için kurallar ,6.17 içinde kapsıyor.

6.1 Geçersize dönüştürme

Herhangi bir türün değeri, void türüne yazarak açıkça atılır. Sonuç yoktur.

6.2 Bool'a dönüştürme

Herhangi bir değeri bool türüne dönüştürme kuralları aşağıdaki gibidir:

  • Sıfır sayısal veya karakter değeri False değerine dönüştürülür; Sıfır olmayan bir sayısal veya karakter değeri True'ya dönüştürülür.
  • Null türünde bir değer False'a dönüştürülür.
  • Uzunluğu 0 olan bir dize False'a dönüştürülür; 0'dan > dize True'ya dönüştürülür.
  • Değere sahip bir switch $true parametresi True, değeri false olan bir $false parametre ise False olarak dönüştürülür.
  • Diğer null olmayan tüm başvuru türü değerleri True'ya dönüştürülür.

Tür IList uygulayıyorsa:

  • Nesnenin Uzunluk değeri 2 >, değer True'ya dönüştürülür.
  • Nesnenin Uzunluğu 1 ise ve bu ilk öğenin kendisi bir IList yoksa, o öğenin değeri true ise değer True'ya dönüştürülür.
  • Aksi takdirde, ilk öğenin Count değeri >= 1 ise değer True'ya dönüştürülür.
  • Aksi takdirde, değer False'a dönüştürülür.

6.3 Karaktere dönüştürme

Herhangi bir değeri char türüne dönüştürme kuralları aşağıdaki gibidir:

  • Bool, ondalık, float veya double türünde bir değerin dönüştürmesi hatada.
  • Null türünde bir değer, null (U+0000) karakterine dönüştürülür.
  • Değeri karakter türünde temsil edilen bir tamsayı türü değeri bu değere sahip olur; aksi takdirde, dönüştürme hatadadır.
  • Uzunluğu 1'den farklı olan bir dize değerinin dönüştürmesi hatada.
  • Uzunluğu 1 olan bir dize değeri, bir karakterin değerine sahip bir karaktere dönüştürülür.
  • Herhangi bir kesirli parça yuvarlantıktan sonra değeri hedef tür içinde temsil edilen bir sayısal tür değeri, bu yuvarlanmış değere sahip; aksi takdirde, dönüştürme hatadadır.
  • Diğer başvuru türü değerleri için, başvuru türü böyle bir dönüştürmeyi destekliyorsa, bu dönüştürme kullanılır; aksi takdirde, dönüştürme hatadadır.

6.4 Tamsayıya dönüştürme

Herhangi bir değeri byte, int veya long türüne dönüştürme kuralları aşağıdaki gibidir:

  • False bool değeri sıfıra dönüştürülür; True bool değeri 1'e dönüştürülür.
  • Değeri hedef türde temsil edilen bir karakter türü değeri bu değere sahip olur; aksi takdirde, dönüştürme hatadadır.
  • Herhangi bir kesirli parça yuvarlantıktan sonra değeri hedef tür içinde temsil edilen bir sayısal tür değeri, bu yuvarlanmış değere sahip; aksi takdirde, dönüştürme hatadadır.
  • Null türünde bir değer sıfıra dönüştürülür.
  • Bir sedyeyi temsil eden bir dize ,6.16'da açıklandığı gibi dönüştürülür. Kesirli parça kesildikten sonra sonuç hedef tür içinde temsil edildikten sonra dize iyi küs ve hedef türüne sahipse; aksi takdirde, dönüştürme hatadadır. Dize bir s sayı temsil etmiyorsa, dönüştürme hatadadır.
  • Diğer başvuru türü değerleri için, başvuru türü böyle bir dönüştürmeyi destekliyorsa, bu dönüştürme kullanılır; aksi takdirde, dönüştürme hatadadır.

6.5 Kayan ve çift dönüştürme

Herhangi bir değeri float veya double türüne dönüştürme kuralları aşağıdaki gibidir:

  • False bool değeri sıfıra dönüştürülür; True bool değeri 1'e dönüştürülür.
  • Bir karakter değeri tam olarak temsil edilen değerdir.
  • Sayısal tür değeri, mümkünse tam olarak temsil edilen bir değerdir; ancak, int, long ve ondalık dönüştürmeleri float için ve uzun ve ondalık dönüştürmeler için tamsayı değerinin en az önemli bitlerinin bazıları kaybolabilir.
  • Null türünde bir değer sıfıra dönüştürülür.
  • Bir sedyeyi temsil eden bir dize ,6.16 içinde açıklandığı gibi dönüştürülür; aksi takdirde, dönüştürme hatadadır.
  • Diğer başvuru türü değerleri için, başvuru türü böyle bir dönüştürmeyi destekliyorsa, bu dönüştürme kullanılır; aksi takdirde, dönüştürme hatadadır.

6.6 Ondalık sayıya dönüştürme

Herhangi bir değeri ondalık türe dönüştürme kuralları aşağıdaki gibidir:

  • False bool değeri sıfıra dönüştürülür; True bool değeri 1'e dönüştürülür.
  • Karakter türü değeri tam olarak temsil edilen değerdir.
  • Sayısal tür değeri tam olarak temsil edilen; ancak, bu değer hedef türe sığmayacak kadar büyükse veya çok küçükse dönüştürme hata verir.
  • Null türünde bir değer sıfıra dönüştürülür.
  • Bir sedyeyi temsil eden bir dize ,6.16 içinde açıklandığı gibi dönüştürülür; aksi takdirde, dönüştürme hatadadır.
  • Diğer başvuru türü değerleri için, başvuru türü böyle bir dönüştürmeyi destekliyorsa, bu dönüştürme kullanılır; aksi takdirde, dönüştürme hatadadır.
  • Başarılı bir dönüştürmenin sonucu ölçeği, kesirli parçanın sonda sıfırlar yer alamaymayacak şekildedir.

6.7 Nesneye dönüştürme

Null tür (4.1.2) dışındaki herhangi bir türün değeri tür nesnesine dönüştürülür. Değer, türünü ve gösterimini korur.

6.8 Dizeye dönüştürme

Herhangi bir değeri tür dizesine dönüştürme kuralları aşağıdaki gibidir:

  • Bool değeri $false "False" değerine, bool değeri $true ise "True" değerine dönüştürülür.
  • Bir karakter türü değeri, bu karakteri içeren 1 karakterlik bir dizeye dönüştürülür.
  • Sayısal tür değeri, karşılık gelen sayısal değişmez değer biçimine sahip bir dizeye dönüştürülür. Ancak sonuçta başta veya sonda boşluk, baştaki artı işareti yok, tamsayılarda taban 10 ve tür soneki yoktur. Ondalık dönüştürme için ölçek korunur. -∞, +∞ ve NaN değerleri için elde edilen dizeler sırasıyla "-Infinity", "Infinity" ve "NaN" şeklindedir.
  • Null türünde bir değer boş dizeye dönüştürülür.
  • 1 boyutlu bir dizi için sonuç, bu dizideki her öğenin baştan sona değerini içeren ve öğelerin geçerli Çıkış Alanı Ayıracı ile ayrıldığı dizeye dönüştürülen bir dizedir (geçerli Çıkış Alanı Ayırıcısı (yaklaşık 2.3.2.2). Kendilerinin dizileri olan öğelere sahip bir dizi için yalnızca üst düzey öğeler dönüştürülür. Dizi olan bir öğenin değerini temsil etmek için kullanılan dize, uygulama tanımlıdır. Çok boyutlu bir dizi için düz (yaklaşık 9,12) ve ardından 1 boyutlu dizi olarak kabul edilir.
  • Null türünde bir değer boş dizeye dönüştürülür.
  • Scriptblock türü değeri, { ve } karakterleri sınırlandırmadan bu bloğun metnini içeren bir dizeye dönüştürülür.
  • Bir sabit değer için sonuç, bu değerde kodlanmış ve virgülle ayrılmış her bir sabit sabitin adını içeren bir dizedir.
  • Diğer başvuru türü değerleri için, başvuru türü böyle bir dönüştürmeyi destekliyorsa, bu dönüştürme kullanılır; aksi takdirde, dönüştürme hatadadır.

Dizi olan bir öğenin değerini temsil etmek için kullanılan dize System.type[], ve System.type[,]gibi biçime sahip olur. Diğer başvuru türleri için yöntemi ToString çağrılır. Diğer numaralanabilir türler için, kaynak değer 1 boyutlu bir dizi olarak kabul edilir.

6.9 Diziye dönüştürme

Herhangi bir değeri dizi türüne dönüştürme kuralları aşağıdaki gibidir:

  • Hedef türü çok boyutlu bir dizi olabilir.
  • Null tür değeri olduğu gibi korunur.
  • veya karma tablosu türünden $null başka bir skaler değer için, hedef öğe türüne dönüştürmeden sonra değeri skaler olan yeni bir 1 öğeli dizi oluşturulur.
  • 1 boyutlu bir dizi değeri için hedef türünde yeni bir dizi oluşturulur ve her öğe kaynak diziden hedef dizideki karşılık gelen öğeye dönüştürme ile kopyalanır.
  • Çok boyutlu bir dizi değeri için, bu dizi ilk olarak düz (yaklaşık 9,12) ve ardından 1 boyutlu dizi değeri olarak kabul edilir.
  • Dize değeri, dizideki karşılık gelen konumlar kaplayacak şekilde dizeden gelen karakterlerle aynı uzunlukta olan bir karakter dizisine dönüştürülür.

Diğer numaralanabilir türler için, böyle bir dönüştürme varsa, hedef öğe türüne dönüştürmeden sonra değeri karşılık gelen öğe olan yeni bir 1 öğeli dizi oluşturulur. Aksi takdirde, dönüştürme hata olur.

6.10 Xml'e dönüştürme

nesnesi, tür dizesine ve ardından türünde bir XML Belgesi nesnesine dönüştürülür xml.

6.11 Regex'e dönüştürme

Dize türünde bir değere sahip olan bir ifade, türüne dönüştürülür regex.

6.12 Scriptblock'a dönüştürme

Herhangi bir değeri türe dönüştürme kuralları scriptblock aşağıdaki gibidir:

  • Dize değeri, isteğe bağlı olarak bir komutun çağrısına bağımsız değişkenler tarafından takip edilen bir komutun adı olarak kabul edilir.

6.13 Numaralama türlerine dönüştürme

Herhangi bir değeri bir numaralama türüne dönüştürme kuralları aşağıdaki gibidir:

  • Bir numaralama türü için adlandırılmış değerlerden birini (büyük/küçük harfe göre) içeren dize türü değeri, bu adlandırılmış değere dönüştürülür.
  • Bir liste türü için adlandırılmış değerlerin virgülle ayrılmış listesini (büyük/küçük harfe göre) içeren dize türü değeri, tüm bu adlandırılmış değerlerin bitwise OR değerine dönüştürülür.

6.14 Diğer başvuru türlerine dönüştürme

Herhangi bir değeri bir dizi türü veya dize dışında bir başvuru türüne dönüştürme kuralları aşağıdaki gibidir:

  • Null tür değeri olduğu gibi korunur.
  • Aksi takdirde, davranış uygulama tanımlıdır.

Burada birkaç makine parçası oynatıldı; Bunlar, tek bağımsız değişken oluşturucularının veya değer bir karma tablosu, örtülü ve açık dönüştürme işleçleri ve hedef tür için Ayrıştırma yöntemleri ise varsayılan oluşturucuların olası kullanımını içerir; Convert.ConvertTo kullanımı; ve ETS dönüştürme mekanizması.

6.15 Normal aritmetik dönüştürmeler

İşlecilerin hiçbiri sayısal türe sahip bir değer atamazsa,

  • Sol işlenen bool türünde bir değer tasarlarsa, dönüştürme hata olur.
  • Aksi takdirde, değeri belirten tüm işlenenler $null int türünde sıfıra dönüştürülür ve işlem aşağıda listelenen sayısal dönüştürmelerle devam eder.
  • Aksi takdirde, sol işlenen char türünde bir değer ve sağ işlenen bool türünde bir değer gösterirse dönüştürme hata olur.
  • Aksi takdirde, sol işlenen dize türünde bir değer gösterir ancak bir s sayı temsil etmiyorsa (yaklaşık 6,16), dönüştürme hata verir.
  • Aksi takdirde, sağ işlenen dize türünde bir değer gösterir ancak bir s sayı temsil etmiyorsa (yaklaşık 6,16), dönüştürme hata verir.
  • Aksi takdirde, dize türü değerlerini belirten tüm işlenenler sayılara dönüştürülür (yaklaşık 6.16) ve işlem aşağıda listelenen sayısal dönüştürmelerle devam eder.
  • Aksi takdirde, dönüştürme hata olur.

Sayısal dönüştürmeler:

  • Bir işlenen ondalık türünde bir değer belirtecekse, gerekirse diğer işlenen tarafından belirlenen değer bu türe dönüştürülür. Sonuç ondalık türündedir.
  • Aksi takdirde, bir işlenen çift türünde bir değer belirlediyse, gerekirse diğer işlenen tarafından belirlenen değer bu türe dönüştürülür. Sonucun türü çift.
  • Aksi takdirde, bir işlenen float türünde bir değer belirlediyse, her iki işlenen tarafından belirlenen değerler gerekirse çift türe dönüştürülür. Sonucun türü çift.
  • Aksi takdirde, bir işlenen uzun türünde bir değer belirlediyse, gerekirse diğer işlenen değeri tarafından belirlenen değer bu türe dönüştürülür. Sonuç, değerini temsil eden uzun ve çift dizide ilk olarak türüne sahip olur.
  • Aksi takdirde, her iki işlenen tarafından belirlenen değerler gerekirse int türüne dönüştürülür. Sonuç, int, long, double dizisinde kesme olmadan değerini temsil eden ilk değere sahip olur.

6.16 Dizeden sayısal türe dönüştürme

bir dize, içeriğine bağlı olarak açıkça veya örtülü olarak sayısal bir değere dönüştürmek için kullanılabilir. Daha ayrıntılı belirtmek gerekirse:

  • Boş bir dize sıfır değerine dönüştürülür.
  • Baştaki ve sonda boşluklar yoksayılır; ancak, bir dize yalnızca boşluklardan oluşan bir dizeye sahip değildir.
  • Yalnızca boşluk ve/veya satır sonlandırıcıları içeren bir dize sıfır değerine dönüştürülür.
  • Öndeki + veya - işaretine izin verilir.
  • Tamsayıda onaltılık ön ek (0x veya 0X) olabilir.
  • İsteğe bağlı olarak imzalanmış bir üse izin verilir.
  • Tür son ekleri ve çarpanlarına izin verilmez.
  • "-Infinity", "Infinity" ve "NaN" büyük/harfe özel dizeler sırasıyla -∞, +∞ ve NaN değerleri olarak tanınır.

6.17 Parametre bağlama sırasında dönüştürme

Parametre bağlama hakkında daha fazla bilgi için bkz .8.14.

Bir ifadenin değeri bir parametreye bağlı olduğunda, aşağıda açıklandığı gibi ek dönüştürme konuları vardır:

  • Parametre türü bool veya anahtar (gie 4.2.5, %8.10.5) ise ve parametresi bağımsız değişkene sahipse, çağrılı komutta parametrenin değeri olarak ayarlanır $true. Parametre türü bool veya anahtar dışında ise, bağımsız değişkene sahip bir parametre hatada değil.
  • Parametre türü switch ve bağımsız değişken değeri ise $nullparametre değeri olarak ayarlanır $false.
  • Parametre türü nesne ise veya bağımsız değişkenin türüyle aynı ise, bağımsız değişkenin değeri dönüştürme olmadan geçirildi.
  • Parametre türü nesne veya betik bloğu değilse, scriptblock türüne sahip bir bağımsız değişken değerlendirilir ve sonucu bağımsız değişkenin değeri olarak geçir kullanılır. (Bu gecikmeli betik blok bağlaması olarak bilinir.) Parametre türü nesne veya betik bloğu ise, betik bloğu türünde bir bağımsız değişken olduğu gibi geçirildi.
  • Parametre türü T2 türünde bir koleksiyonsa ve bağımsız değişken T1 türünde bir skaler ise, bu skaler, bir öğe içeren T2 türünde bir koleksiyona dönüştürülür. Gerekirse, skaler değer bu bölümün dönüştürme kuralları kullanılarak T2 türüne dönüştürülür.
  • Parametre türü nesne dışında bir skaler türse ve bağımsız değişken bir koleksiyonsa, bağımsız değişken hatadadır.
  • Beklenen parametre türü T2 türünde bir koleksiyonsa ve bağımsız değişken T1 türünde bir koleksiyonsa, bağımsız değişken, bağımsız değişken koleksiyonuyla aynı uzunlukta T2 türünde bir koleksiyona dönüştürülür. Gerekirse, bağımsız değişken koleksiyonu öğesi değerleri bu bölümün dönüştürme kuralları kullanılarak T2 türüne dönüştürülür.
  • Yukarıdaki adımlar ve bu bölümün başlarında belirtilen dönüştürmeler yeterli yoksa ,6.18'de kurallar uygulanır. Bunlar başarısız olursa parametre bağlama başarısız olur.

6.18 .NET Dönüştürme

Örtülü dönüştürme için önce PowerShell'in yerleşik dönüştürmeleri denenr. Dönüştürmeyi çözümleyemezse, aşağıdaki .NET özel dönüştürücüler sırayla üstten aşağıya doğru denenr. Bir dönüştürme bulunursa ancak bir özel durum oluşturursa, dönüştürme başarısız olur.

  • PSTypeConverter: PSTypeConverter sınıfının uygulamasını hedef sınıfıyla iki şekilde irdeleyebilirsiniz: tür yapılandırma dosyası (types.ps1xml) System.ComponentModel.TypeConverterAttribute aracılığıyla veya özniteliğini hedef sınıfa uygulayarak. Daha fazla bilgi için PowerShell SDK belgelerine bakın.

  • TypeConverter: Bu CLR türü, değer türlerini diğer türlere dönüştürmenin yanı sıra standart değerlere ve alt özelliklere erişmek için birleşik bir yol sağlar. En yaygın dönüştürücü türü, bir metin gösterimine ve metin gösteriminden dönüştüren türlerdendir. Bir sınıfın tür dönüştürücüsü ile sınıfına bağlı.System.ComponentModel.TypeConverterAttribute Bu öznitelik geçersiz kılınmadıkça, bu sınıftan devralan tüm sınıflar temel sınıfla aynı tür dönüştürücüyü kullanır. Daha fazla bilgi için PowerShell SDK ve Microsoft .NET çerçevesi belgelerine bakın.

  • Ayrıştırma Yöntemi: Kaynak türü dize ise ve hedef türün Parseadlı bir yöntemi varsa, dönüştürmeyi gerçekleştirmek için bu yöntem çağrılır.

  • Oluşturucular: Hedef tür, türü kaynak türüne ait olan tek bir bağımsız değişkeni alan bir oluşturucuya sahipse, dönüştürmeyi gerçekleştirmek için bu oluşturucu çağrılır.

  • Örtülü Tür Dönüştürme İşleci: Kaynak türün hedef türe dönüştüren bir örtülü tür dönüştürme işleci varsa, dönüştürmeyi gerçekleştirmek için bu işleç çağrılır.

  • Açık Tür Dönüştürme İşleci: Kaynak türün hedef türe dönüştüren bir açık tür dönüştürme işleci varsa, dönüştürmeyi gerçekleştirmek için bu işleç çağrılır. Hedef türün kaynak türünden dönüştüren açık bir tür dönüştürme işleci varsa, dönüştürmeyi gerçekleştirmek için bu işleç çağrılır.

  • IConvertable: System.Convert.ChangeType dönüştürmeyi gerçekleştirmek için çağrılır.

6.19 Sipariş edilene dönüştürme

Herhangi bir değeri sıralı sahte türe dönüştürme kuralları aşağıdaki gibidir:

  • Değer bir karma değişmez değerse (geçerli değer 2.3.5.6), sonuç karma tablosu gibi davranan uygulama tanımlı bir türe sahip bir nesnedir ve anahtarların sırası karma değişmez değerde belirtilen sırayla eşler.
  • Aksi takdirde, davranış uygulama tanımlıdır.

Yalnızca karma değişmez değer (tag 2.3.5.6) sipariş edilen değere dönüştürülür. Sonuç bir örneğidir System.Collections.Specialized.OrderedDictionary.

6.20 Pscustomobject'e dönüştürme

Herhangi bir değeri pscustomobject sözde türüne dönüştürme kuralları aşağıdaki gibidir:

  • Hashtable türünde bir değer PowerShell nesnesine dönüştürülür. Karma tablondaki her anahtar, karşılık gelen değere sahip bir NoteProperty olur.
  • Aksi takdirde, davranış uygulama tanımlıdır.

Dönüştürmeye her zaman izin verilir, ancak değerin türünü değiştirmez.