Bir örüntü eşleştirme switchifadesinin 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 nullbir türü yoktur ve bu nedenle yukarıdaki koşulların hiçbirini karşılamaz. Statik tip someStringher iki örnekte de devreye girmez.
varDesende eşleştirme olsa tip vahşi kart olarak görür ve dahil olmak üzere herhangi bir değer maç olacak null.
Buradaki defaultdava ölü koddur. case var oHerhangi bir değer, null adlı veya olmayan null adlı eşleşir. Temerrütlü olmayan bir durum her zaman varsayılan olandan defaultdaha 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, defaultasla 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 defaultasla vurulmayacak ( bool1 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.
odestring(jeneriklerle doğrulanan - yaniFoo(o)neredeFoo<T>(T template) => typeof(T).Name)string xvar xxstring