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

时间:2012-12-23 13:55:48

标签: c# .net reflection types

  • 摘要

    typeof(ISomeInterface).BaseTypenull;根据定义,typeof(object).BaseType也是null。因此:

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

    它可以(语义上)意味着System.Object也是一个界面,不是吗?在c#中,所有类都继承自System.Object,但接口不继承。接口实际上是契约,而不是任何类的基类型,并且只能从其他接口派生。

    所以我想知道typeof(object).BaseType是否应该与接口相同?

  • 解释

    我认为这是基本的数学逻辑。我将null视为0并将typeof(object)视为1,以便找到某种类型的基本类型就像查找数字的因子一样。

    在此假设下,null可以是任何类型的推导,例如0是任意数量的倍数。并且typeof(object)将是任何类的基本类型,例如1甚至是任何数字的因子。然而,null的实际返回typeof(object).BaseType打破了这一假设。这似乎说01的一个因素,但不是任何其他数字。

    此外,如果我们使用方法递归查找SomeType的基本类型,我们不能总是说SomeType不是一个类,因为BaseTypenulltypeof(object).BaseType也是null

    如果

    ,这似乎是矛盾的
    typeof(object).BaseType==typeof(object) -> true 
    

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


更新:

我最初说过:

  

这可能意味着System.Object也是一个界面,不是吗?

我想说的是似乎很困惑。这是我表达不好的描述的错,并且很抱歉导致答案集中在那上面。

6 个答案:

答案 0 :(得分:7)

ClassesInterfaces是两回事。以下表达式:

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

之所以如此,只是因为以下情况也是如此:

null == null

根据定义,如果当前类型表示对象类或接口,BaseType将返回null。

  

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

实际上不是,因为接口只包含方法的签名,而不包含它们的实现。您可以将接口视为类必须实现的契约。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

由于MSDN says;

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


接口继承自零个或多个基接口;因此,如果null对象代表Type,则此属性返回interface。可以使用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类层次结构中的所有类。

答案 3 :(得分:4)

请注意:接口不是类和结构的意义上的类型!接口本身并不存在。

类和结构是数据(代码)的类型,但接口是类型的类型。它们可用于分类其他类型。他们强迫其他类型遵循协议,仅此而已。它们只是一种布局,一种定义,一种契约;不是现有的东西。

答案 4 :(得分:3)

.net中有许多类型是“特殊的”,包括System.ObjectSystem.ValueTypeSystem.Enum,它们在继承层次结构中的行为是唯一的。例如,从T派生的任何类型System.ValueType都是值类型,除非TSystem.ValueTypeSystem.Enum,两者都是类类型。缺少Object的基本类型可能会以类似的方式查看 - 缺少基本类型的每种类型都是一个接口,除了System.Object这是一个古怪的。

答案 5 :(得分:1)

  

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

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

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

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

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