为什么这种开关类型的情况被认为是令人困惑的
本文关键字:认为是 情况 开关 类型 为什么 | 更新日期: 2023-09-27 17:58:55
我一直在寻找一种重构和简化一个函数的方法,在这个函数中,我必须根据输入类类型进行数据排序,但在switch(input.GetType()):
上遇到了麻烦
快速搜索让我找到了Why dons';C#开关语句是否允许使用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
。并且CCD_ 10对应于CCD_。
我错过了什么吗?
您似乎不希望开关在子类上匹配。但这将打破利斯科夫替代原则。(其中,如果您传入一个C对象,代码会工作,但不能使用D,即使D是C的子类)。
我认为Peter Hallam的博客文章中有一个非常有效的论点,即如果对事物进行重新排序,则不希望switch
语句有所不同,因此只有当只有一个分支同时有效时,这才真正有用,而对于Type
,一个类在继承链上总是有多个不同的类型。
没有人会阻止你用if…else链来做这件事,你确实希望它能按照你放东西的顺序进行评估。