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/2460
Koşullu İfade Dönüştürme
koşullu ifade c ? e1 : e2
için,
-
e1
vee2
için ortak bir tür yoktur veya - Ortak bir türün var olduğu ancak
e1
veyae2
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
İ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:
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:
Atama İfadesi
Geçerli C# dil belirtimi şu şekildedir:
(T)E
veT
unary_expressionolduğuE
formun cast_expression, değerininE
tü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.
Tasarım Notları
ifadesinden daha iyi dönüştürmeyi sağlamak amacıyla,
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 c
C
türündeyse, d
D
tü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.
C# feature specifications