Aracılığıyla paylaş


Koşullu İfade Target-Typed

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çinbelirtimleri makalesinde bulabilirsiniz.

Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/2460

Koşullu İfade Dönüştürme

koşullu ifade c ? e1 : e2için,

  1. e1 ve e2için ortak bir tür yoktur veya
  2. Ortak bir türün var olduğu ancak e1 veya e2 ifadelerinden birinin bu türe örtük bir dönüşümü olmadığı

koşullu ifadeden herhangi bir tür 'ye örtük dönüşüme izin veren ve bu dönüşümün, T'ten e1'e ve ayrıca T'ten e2'ya dönüşümü olduğu durumlarda uygulanabileceği yeni bir örtük T tanımladık. Koşullu ifadenin ile arasında ortak bir türü yoksa veyakoşullu ifade dönüştürmesine tabi değilse hatadır.

İfadelerin Daha İyi Dönüştürülmesi

Değiştiriyoruz

İfade dönüşümünü iyileştirme

bir ifadeden türüne dönüştüren örtük dönüştürme ve bir ifadeden türüne dönüştüren örtük dönüştürme , tam olarak eşleşmediği ve aşağıdakilerden en az birinin barındırdığı daha iyi bir dönüştürme daha iyi bir dönüştürmedir:

  • E T1 tam olarak eşleşir (§12.6.4.5)
  • T1, T2'den daha iyi bir dönüştürme hedefidir (§12.6.4.7)

Hedef

İfade dönüşümünü iyileştirme

bir ifadeden türüne dönüştüren örtük dönüştürme ve bir ifadeden türüne dönüştüren örtük dönüştürme , tam olarak eşleşmediği ve aşağıdakilerden en az birinin barındırdığı daha iyi bir dönüştürme daha iyi bir dönüştürmedir:

  • E T1 tam olarak eşleşir (§12.6.4.5)
  • C1 bir koşullu ifade dönüştürme değildir ve C2koşullu ifade dönüştürme.
  • T1, T2'den daha iyi bir dönüştürme hedefidir (§12.6.4.7) ve C1 ile C2'nın her ikisi de koşullu ifade dönüştürmeleridir veya hiçbiri koşullu ifade dönüştürmedeğildir.

Atama İfadesi

Geçerli C# dil belirtimi şu şekildedir:

(T)E ve Tunary_expressionolduğu Eformun cast_expression, değerinin Etürüne açık dönüştürmesini (T) gerçekleştirir.

koşullu ifade dönüştürmesi mevcutken, E'den T'e birden fazla olası dönüştürme olabilir. koşullu ifade dönüştürmesinin eklenmesiyle, diğer tüm dönüştürmeleri koşullu ifade dönüştürmesinetercih ederiz ve koşullu ifade dönüştürmesini yalnızca son çare olarak kullanırız.

Tasarım Notları

ifadesinden daha iyi dönüştürmeyi sağlamak amacıyla, değişikliğinin nedeni böyle bir durumu ele almaktır.

M(b ? 1 : 2);

void M(short);
void M(long);

Bu yaklaşımın iki küçük dezavantajı vardır. İlk olarak, switch ifadesiyle tam olarak aynı değildir:

M(b ? 1 : 2); // calls M(long)
M(b switch { true => 1, false => 2 }); // calls M(short)

Önemli bir değişiklik olmaya devam ediyor, ancak kapsamı gerçek programları etkileme olasılığı daha düşük.

M(b ? 1 : 2, 1); // calls M(long, long) without this feature; ambiguous with this feature.

M(short, short);
M(long, long);

long'ye dönüşüm, ilk bağımsız değişken için daha iyi olduğu için (çünkü koşullu ifade dönüşümünükullanmaz), durum belirsizleşir. Ancak, short'e dönüşüm ikinci bağımsız değişken için daha iyidir (çünkü short, 'den long'dır). Bu yıkıcı değişiklik, mevcut bir programın davranışını sessizce değiştirmediğinden daha az ciddi görünür.

Tür ifadesinde notların nedeni aşağıdaki gibi bir olayı işlemektir:

_ = (short)(b ? 1 : 2);

Bu program şu anda int'den short'a açık dönüştürmeyi kullanıyor ve bu programın geçerli dil anlamını korumak istiyoruz. Değişiklik çalışma zamanında gözlemlenemez, ancak aşağıdaki programla değişiklik gözlemlenebilir:

_ = (A)(b ? c : d);

burada cCtüründeyse, dDtüründedir ve C 'den D'e örtük bir kullanıcı tanımlı dönüştürme ve D 'den A'e örtük kullanıcı tanımlı dönüştürme ve C'den A'e örtük kullanıcı tanımlı dönüştürme vardır. Bu kod C# 9.0'dan önce derlenmişse, b doğru olduğunda c'den D'a ve ardından A'a dönüştürüriz. koşullu ifade dönüştürmesini kullanırsak, doğru olduğunda, 'den doğrudan 'ye dönüştürürüz, bu da farklı bir kullanıcı kodu dizisinin çalıştırılmasına neden olur. Bu nedenle, var olan davranışı korumak için koşullu ifade dönüştürme bir atamada son çare olarak ele alıyoruz.