Когда я отвечал на этот вопрос , я наблюдал очень странное поведение, уникальное для выражений переключения - они, кажется, могут вывести свои типы, когда они имеют неоднозначный тип.
For Например, это не компилирует
double a = new Random().Next(2) == 0 ? (short)1 : (uint)1;
, потому что компилятор «не смотрит» на часть double a
при проверке типа и видит, что выражение имеет тип либо short
или uint
. Выражение не может быть двух типов, поэтому выводится ошибка. Это отлично. Довольно хорошо известно, что C# не учитывает тип переменной, которую вы назначаете, как и в дженериках:
static T F<T>() => default(T);
double d = F(); // can't infer that T is double
Однако , выражения switch ломаются это «правило». Если я перепишу первый фрагмент кода с помощью выражений переключения:
double a = (new Random().Next(2) == 0) switch {
true => (short)1,
false => (uint)1
};
Затем он внезапно компилируется! В отличие от первого фрагмента кода, компилятор, похоже, обратил внимание на часть double a
и понял, что мне нужен double
. Я попытался посмотреть docs для выражений переключателя, но там не упоминается, что он будет выполнять какие-либо автоматические c преобразования в тип результата или что-то подобное.
Почему C# так ли умен, когда работаете с выражениями переключателя, но не с другими типами выражений (такими как тернарный оператор)?