[翻译]并非一切类型都继承源自object

[原文来自Eric Lippert的:Not everything derives from object]
我听过很多C#的神话。这些神话通常都是对的,比如“值类型总是分配在栈上”。如果你把“总是”替换成“有时”,那么一些不正确的神话论点就变得正确。

其中一个我经常听到的便是“在C#里一切类型都继承源自object”(in C# every type derives from object)。这不对!

首先,指针类型没有继承源自object,也不能转换成object。不安全的指针类型很明显的脱离了这个语言里的常规类型规则。(如果你想将指针看做值类型,你可以将其转换成System.IntPtr,然后便可以作为值类型使用它。)我们抛开指针类型不谈。

非常多的类型继承源自object。所有值类型,包括枚举和可空类型,继承源自object。所有的类,数组和委托类型继承源自object。

这里是所有的“具体”类型;你实际遇到的任何对象实例都是null,或一个类、委托、数组、结构、枚举或可空值类型。所以这里需要纠正,尽管相差不大,应该说所有实例都继承源自object。但那就不是神话了;那个神话说所有类型都继承源自object。

接口类型,不是类,没有继承源自object。他们都可以转换成object,当然,因为我们知道在运行时实例都是具体的类型。但接口只继承其他接口类型,object不是接口类型。

“开放式”类型参数(译注:泛型的类型参数)类型也不是继承自object。他们当然是类型。你可以创建一个类型为类型参数的字段。当泛型的类和方法最终只有用“具体”类型参数在运行时“构造”后,类型参数类型便总是可以转换成object。(这就是为什么你不能创建IEnumerable<void*>----我们规定类型参数必须可以转换成object。)类型参数类型没有继承自任何东西;他们有个“有效的基类”,所以类型参数被约束为继承自有效的基类,但是他们自身却不是“继承自”任何东西。

纠正这个神话的方法可以简单的替换“继承源自”(derives from)为“可以转换到”(is convertible to),且忽略指针类型:C#中任何非指针的类型是可以转换成object的。(every non-pointer type in C# is convertible to object.)

posted @ 2010-01-28 20:35 甜番薯 阅读(...) 评论(...) 编辑 收藏