Почему этот переключатель на корпусе типа считается запутанным?

Я искал способ рефакторинга и упростил одну функцию, где мне нужно сортировать данные в зависимости от типа входного класса и застрял в switch(input.GetType()):

Быстрый поиск привел меня к Почему оператор С# switch не позволяет использовать typeof/GetType()? со ссылкой на http://blogs.msdn.com/peterhal/archive/2005/07/05/435760.aspx

Я прочитал документацию, но я не понимаю, что ситуация запутанна.

Из статьи:

К сожалению, как и многие "простые" языковые функции, переключатель типа не так же просто, как вначале. проблемы начинаются, когда вы смотрите на более значительным и не менее важным, Пример:

class C {}
interface I {}
class D : C, I {}

switch typeof(e) {
case C: ... break;
case I: ... break;
default: ... break;
}

Что не так просто? Вызов typeof(e) не может возвратиться - это I D и C. Он должен вернуть Type не массив интерфейсов и типов классов - Type[]. Таким образом, тип class D равен D. А D соответствует ветки default:.

Я что-то пропустил?

Ответ 1

Кажется, вы не ожидаете, что коммутатор будет соответствовать подклассам. Но это нарушит Принцип замещения Лискова. (где, если вы передали объект C, код будет работать, но не с D, хотя D является подклассом C).

Ответ 2

Я думаю, что это вполне обоснованный аргумент в отношении записи в блоге Peter Hallam, в которой вы не ожидаете, что оператор switch будет отличаться, если вы измените порядок вещей, поэтому он действительно полезен, если только одна ветка может быть действительной одновременно, тогда как с Type один класс всегда несколько разных типов по цепочке наследования.

Никто не останавливает вас от этого с цепочкой if... else, где вы ожидаете, что он будет оценен в том порядке, в котором вы помещаете вещи.