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

时间:2011-06-10 10:01:18

标签: c# switch-statement

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

快速搜索引导我Why doesn't C# switch statement allow using 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 DC。它必须返回Type而不是接口和类类型数组 - Type[]。因此class D的类型为DD对应default:分支。

我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我认为对于Peter Hallam的博客文章来说,如果你重新排序,你不希望switch语句有所不同,这是非常有效的,所以只有一个分支同时有效才真正有用,而对于Type,一个类在继承链中始终是多个不同的类型。

没有人会阻止你使用if ... else链进行此操作,你可以按照你放置的顺序对它进行评估。