Почему это переключение на регистр типа считается запутанным? - PullRequest
2 голосов
/ 10 июня 2011

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

Быстрый поиск привел меня к Почему оператор C # 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:.

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

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

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

3 голосов
/ 10 июня 2011

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

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

...