Bir örüntü eşleştirme switch
ifadesinin içinde case
, açık bir tür için a kullanan , söz konusu değerin bu belirli türden mi yoksa türetilmiş türden mi olduğunu soruyor. Tam eşdeğeriis
switch (someString) {
case string s:
}
if (someString is string)
Değerin null
bir türü yoktur ve bu nedenle yukarıdaki koşulların hiçbirini karşılamaz. Statik tip someString
her iki örnekte de devreye girmez.
var
Desende eşleştirme olsa tip vahşi kart olarak görür ve dahil olmak üzere herhangi bir değer maç olacak null
.
Buradaki default
dava ölü koddur. case var o
Herhangi bir değer, null adlı veya olmayan null adlı eşleşir. Temerrütlü olmayan bir durum her zaman varsayılan olandan default
daha fazla kazanır, dolayısıyla asla vurulmayacaktır. IL'ye bakarsanız, yayınlanmadığını bile görürsünüz.
Bir bakışta, bunun herhangi bir uyarı olmadan derlenmesi garip görünebilir (kesinlikle beni attı). Ancak bu, 1.0'a geri dönen C # davranışı ile eşleşiyor. Derleyici, default
asla vurulmayacağını önemsiz bir şekilde kanıtlayabilse bile durumlara izin verir . Örnek olarak şunları düşünün:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Burada default
asla vurulmayacak ( bool
1 veya 0 olmayan bir değere sahip olsa bile ). Yine de C # buna 1.0'dan beri uyarı yapmadan izin verdi. Örüntü eşleme burada bu davranışla aynı çizgide.
o
destring
(jeneriklerle doğrulanan - yaniFoo(o)
neredeFoo<T>(T template) => typeof(T).Name
)string x
var x
x
string