System.Object的BaseType应该与接口相同吗?
-
摘要
typeof(ISomeInterface).BaseType
为null
;typeof(object).BaseType
根据定义也为null
。 从而:typeof(object).BaseType==typeof(ISomeInterface).BaseType -> true
它(语义上)可能意味着
System.Object
也是一个接口,不是吗? 在c#中,所有类都inheritance自System.Object
,但接口不inheritance。 接口实际上是契约,而不是任何类的基类型,并且只能从其他接口派生。所以我想知道
typeof(object).BaseType
是否应该与接口相同? -
说明
我认为这是基本的数学逻辑。 我将
null
视为0
,将typeof(object)
视为1
,因此查找某种类型的基类型就像查找数字的因子一样。在这种假设下,
null
可以是任何类型的推导,例如0
是任意数的因子的倍数。 而typeof(object)
将是任何类的基本类型,例如1
是任何数字的因子甚至本身。 然而,typeof(object).BaseType
的实际返回null
打破了这个假设。 这似乎是说0
是因子1
而不是任何其他数字。此外,如果我们使用一种方法递归地查找
SomeType
的基类型,我们不能总是说SomeType
不是一个类,因为它的BaseType
为null
,typeof(object).BaseType
也为null
。如果这似乎是矛盾的
typeof(object).BaseType==typeof(object) -> true
提出它的基本类型本身,但实际上并不是实体和合同之间的区别?
更新:
我最初说过:
它可能意味着
System.Object
也是一个接口,不是吗?
我想说的是它似乎很困惑 。 这是表达不佳的描述的错误,并且很抱歉导致答案集中于此。
BaseType
属性返回具有基本类型的类型的基本类型。 对于所有其他类型,它返回一个值,指示该类型没有基类型。 您在原始问题中提出以下表达式:
typeof(object).BaseType == typeof(SomeInterface).BaseType
然后,您建议由于此表达式为true,因此Object
和SomeInterface
似乎具有相同的基本类型。 但是,您的结论存在缺陷,因为它假定Object
和SomeInterface
都存在基类型,而该方法的文档明确指出不是这种情况。
类和接口是两回事。 以下表达式:
typeof(object).BaseType == typeof(SomeInterface).BaseType
是真的只是因为以下情况也是如此:
null == null
并且,根据定义,如果当前类型表示对象类或接口,则BaseType返回null。
它可能意味着System.Object也是一个接口,不是吗?
实际上不是,因为接口只包含方法的签名,而不包含它们的实现。 您可以将接口视为类必须实现的合同。
typeof(object).BaseType
由于MSDN 说 , typeof(object).BaseType
返回null
;
Object是唯一没有基类型的类型,因此返回null作为Object的基类型。
您不能将BasType
属性与Interface
一起使用。 我们来看看这段代码;
using System; namespace Programs { public interface IBar { } public interface IFoo : IBar { } public class Program { public static void Main(string[] args) { Type[] types = typeof(IFoo).GetInterfaces(); foreach ( var t in types ) { Console.WriteLine(t.ToString()); } } } }
输出:
Programs.IBar
接口inheritance自零个或多个基接口; 因此,如果Type
对象表示interface
,则此属性返回null
。 可以使用GetInterfaces
或FindInterfaces
确定基接口。
我们来看另外一个代码;
using System; namespace Programs { public interface IBar { } public interface IFoo : IBar { } public interface IZoo : IFoo { } public class Program { public static void Main(string[] args) { Type[] types = typeof(IZoo).GetInterfaces(); foreach ( var t in types ) { Console.WriteLine(t.ToString()); } } } }
输出是:
Programs.IFoo
Programs.IBar
问题是,我们使用typeof(object).BaseType得到了null。 它可能意味着System.Object也是一个接口,不是吗?
不, System.Object不是接口。 这是一堂课。 它支持.NET Framework类层次结构中的所有类。
请注意:接口不是类和结构的意义上的类型! 接口本身不存在。
类和结构是数据(代码)的类型,但接口是类型的类型。 它们可用于分类其他类型。 他们强迫其他类型遵循协议,仅此而已。 它们只是一种布局,一种定义,一种契约; 不是现有的东西。
.net中有许多类型是“特殊的”,包括System.Object
, System.ValueType
和System.Enum
,它们在inheritance层次结构中的行为是唯一的。 例如,从System.ValueType
派生的任何类型T
都是值类型,除非T
是System.ValueType
或System.Enum
,两者都是类类型。 缺少Object
的基类型可能会以类似的方式查看 – 缺少基类型的每种类型都是一个接口,除了System.Object
这是一个古怪的东西。
“它可以(语义上)意味着System.Object也是一个接口,不是吗?”
不,这个假设依赖于这些假设:
- BaseType属性始终返回类型的基本类型
- 具有相同基本类型的两种类型是相同的
当typeof(object).BaseType
返回null
它并不意味着基类型为null
,这意味着根本没有基类型。 因此,当typeof(ISomeInterface).BaseType
也返回null
它并不意味着它具有与object
相同的基类型,这意味着它根本没有基类型。
即使object
和接口具有相同的基类型,也不意味着object
是接口。 例如int
和double
类型具有相同的基类型,但这并不意味着它们是相同的。