Di dalam switch
pernyataan pencocokan pola yang menggunakan a case
untuk 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 null
tidak memiliki tipe dan karenanya tidak memenuhi salah satu kondisi di atas. Jenis statis someString
tidak ikut bermain di kedua contoh.
The var
Tipe meskipun dalam pencocokan pola bertindak sebagai kartu liar dan akan cocok dengan nilai apapun termasuk null
.
The default
terjadi di sini adalah kode mati. The case var o
akan ditemukan nilai, null atau non-null. Kasus non-default selalu menang atas kasus default sehingga default
tidak 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 default
kasus 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 default
tidak akan pernah terkena (bahkan untuk bool
yang 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.
o
inistring
(dikonfirmasi dengan obat generik - yaituFoo(o)
di manaFoo<T>(T template) => typeof(T).Name
) - itu adalah kasus yang sangat menarik di manastring x
berperilaku berbeda darivar x
bahkan ketikax
diketik (oleh kompilator) sebagaistring