System.Object的BaseType应该与接口相同吗?

  • 摘要

    typeof(ISomeInterface).BaseTypenull ; 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不是一个类,因为它的BaseTypenulltypeof(object).BaseType也为null

    如果这似乎是矛盾的

     typeof(object).BaseType==typeof(object) -> true 

    提出它的基本类型本身,但实际上并不是实体和合同之间的区别?


更新:

我最初说过:

它可能意味着System.Object也是一个接口,不是吗?

我想说的是它似乎很困惑 。 这是表达不佳的描述的错误,并且很抱歉导致答案集中于此。

BaseType属性返回具有基本类型的类型基本类型。 对于所有其他类型,它返回一个值,指示该类型没有基类型。 您在原始问题中提出以下表达式:

typeof(object).BaseType == typeof(SomeInterface).BaseType

然后,您建议由于此表达式为true,因此ObjectSomeInterface似乎具有相同的基本类型。 但是,您的结论存在缺陷,因为它假定ObjectSomeInterface都存在基类型,而该方法的文档明确指出不是这种情况。

类和接口是两回事。 以下表达式:

 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 。 可以使用GetInterfacesFindInterfaces确定基接口。


我们来看另外一个代码;

 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.ObjectSystem.ValueTypeSystem.Enum ,它们在inheritance层次结构中的行为是唯一的。 例如,从System.ValueType派生的任何类型T都是值类型,除非TSystem.ValueTypeSystem.Enum ,两者都是类类型。 缺少Object的基类型可能会以类似的方式查看 – 缺少基类型的每种类型都是一个接口,除了System.Object这是一个古怪的东西。

“它可以(语义上)意味着System.Object也是一个接口,不是吗?”

不,这个假设依赖于这些假设:

  • BaseType属性始终返回类型的基本类型
  • 具有相同基本类型的两种类型是相同的

typeof(object).BaseType返回null它并不意味着基类型为null ,这意味着根本没有基类型。 因此,当typeof(ISomeInterface).BaseType也返回null它并不意味着它具有与object相同的基类型,这意味着它根本没有基类型。

即使object和接口具有相同的基类型,也不意味着object是接口。 例如intdouble类型具有相同的基类型,但这并不意味着它们是相同的。