Усередині switch
оператора збігу шаблонів, що використовує case
для явного типу, запитується, чи відповідає значення саме тому типу або похідному типу. Це точний еквівалентis
switch (someString) {
case string s:
}
if (someString is string)
Значення null
не має типу і, отже, не задовольняє жодній із зазначених вище умов. Статичний тип someString
не вступає в дію в жодному з прикладів.
var
Типу , хоча в шаблоні відповідність діє як джокер і буде відповідати будь-якому значенню , включаючи null
.
default
Справа тут мертвий код. Значення case var o
буде відповідати будь-якому значенню, нульовому чи ненульовому. Справа, що не відповідає замовчуванню, завжди виграє над типовою, отже default
, ніколи не буде вражена. Якщо ви подивитесь на ІЛ, то побачите, що він навіть не виділяється.
На перший погляд може здатися дивним, що це компілюється без будь-якого попередження (безумовно, мене відкинуло). Але це відповідає поведінці C #, яка повертається до 1.0. Компілятор допускає default
випадки, навіть коли він банально може довести, що його ніколи не вдарять. Розглянемо як приклад наступне:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Тут default
ніколи не потрапить (навіть для того, bool
що має значення, яке не 1 або 0). Однак C # дозволив це з 1.0 без попередження. Збіг шаблонів просто відповідає цій поведінці тут.
o
цеstring
(підтверджується дженериків - тобтоFoo(o)
деFoo<T>(T template) => typeof(T).Name
) - це дуже цікавий випадок , колиstring x
поводиться інакше , ніжvar x
навіть тоді , колиx
набирається (компілятором) , якstring