为什么这种开关类型的案例被认为是令人困惑的?

我正在寻找一种方法来重构和简化一个函数,我必须根据输入类类型进行数据排序,并且卡在switch(input.GetType()):

快速搜索让我知道为什么C#switch语句不允许使用typeof / GetType()? 链接到http://blogs.msdn.com/peterhal/archive/2005/07/05/435760.aspx

我阅读了文档,但我没有理由认为情况令人困惑。

来自文章:

不幸的是,与许多“简单”语言function一样,类型切换并不像它第一次出现那么简单。 当你看到一个更重要的,同样重要的例子时,麻烦就开始了:

 class C {} interface I {} class D : C, I {} switch typeof(e) { case C: ... break; case I: ... break; default: ... break; } 

有什么不简单的? 呼叫类型typeof(e)无法返回 – 这是I DC 它必须返回一个Type而不是一个接口和类类型数组 – Type[] 。 因此class D的类型是D 并且D对应于default:分支。

我错过了什么?

看来你不希望开关在子类上匹配。 但这会破坏Liskov替代原则。 (如果你传入一个C对象,代码可以工作,但不能用D,即使D是C的子类)。

我认为对于Peter Hallam的博客文章来说,如果你重新排序,你不希望switch语句有所不同,所以只有当一个分支同时有效时它才有用,而Type一类是沿着inheritance链总是有多种不同的类型。

没有人阻止你使用if … else链来做这件事,你确实希望按照你放置的顺序对它进行评估。