Di dalam switchpernyataan pencocokan pola yang menggunakan a caseuntuk tipe eksplisit menanyakan apakah nilai yang dimaksud adalah dari tipe spesifik itu, atau tipe turunan. Ini sama persis denganis
switch (someString) {
case string s:
}
if (someString is string)
Nilai nulltidak memiliki tipe dan karenanya tidak memenuhi salah satu kondisi di atas. Jenis statis someStringtidak ikut bermain di kedua contoh.
The varTipe meskipun dalam pencocokan pola bertindak sebagai kartu liar dan akan cocok dengan nilai apapun termasuk null.
The defaultterjadi di sini adalah kode mati. The case var oakan ditemukan nilai, null atau non-null. Kasus non-default selalu menang atas kasus default sehingga defaulttidak akan pernah terkena. Jika Anda melihat IL Anda akan melihat itu bahkan tidak dipancarkan.
Sekilas mungkin tampak aneh bahwa kompilasi ini tanpa peringatan apa pun (pasti membuat saya bingung). Tapi ini cocok dengan perilaku C # yang kembali ke 1.0. Kompilator mengizinkan defaultkasus bahkan ketika ia dapat dengan mudah membuktikan bahwa ia tidak akan pernah terpukul. Perhatikan sebagai contoh berikut ini:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Disini defaulttidak akan pernah terkena (bahkan untuk boolyang memiliki nilai bukan 1 atau 0). Namun C # telah mengizinkan ini sejak 1.0 tanpa peringatan. Pencocokan pola hanya sejalan dengan perilaku ini di sini.
oinistring(dikonfirmasi dengan obat generik - yaituFoo(o)di manaFoo<T>(T template) => typeof(T).Name) - itu adalah kasus yang sangat menarik di manastring xberperilaku berbeda darivar xbahkan ketikaxdiketik (oleh kompilator) sebagaistring