Ответ 1
Кажется, вы не ожидаете, что коммутатор будет соответствовать подклассам. Но это нарушит Принцип замещения Лискова. (где, если вы передали объект C, код будет работать, но не с D, хотя D является подклассом C).
Я искал способ рефакторинга и упростил одну функцию, где мне нужно сортировать данные в зависимости от типа входного класса и застрял в 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:
.
Я что-то пропустил?
Кажется, вы не ожидаете, что коммутатор будет соответствовать подклассам. Но это нарушит Принцип замещения Лискова. (где, если вы передали объект C, код будет работать, но не с D, хотя D является подклассом C).
Я думаю, что это вполне обоснованный аргумент в отношении записи в блоге Peter Hallam, в которой вы не ожидаете, что оператор switch
будет отличаться, если вы измените порядок вещей, поэтому он действительно полезен, если только одна ветка может быть действительной одновременно, тогда как с Type
один класс всегда несколько разных типов по цепочке наследования.
Никто не останавливает вас от этого с цепочкой if... else, где вы ожидаете, что он будет оценен в том порядке, в котором вы помещаете вещи.