5
  • 概括

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

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

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

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

  • 解释

    我以初等数理逻辑的方式想到了这一点。我将nullas0typeof(object)as 视为1,因此查找某种类型的基本类型就像查找数字的因数一样。

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

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

    如果

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

    表示它的基本类型是它自己,但这不正是实体和合同之间的区别吗?


更新:

我原来是这么说的:

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

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

4

6 回答 6

7

接口是两个不同的东西。以下表达式:

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

仅是因为以下也是正确的:

null == null

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

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

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

于 2012-12-23T14:21:49.930 回答
6

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

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

然后你建议,既然这个表达式是真的,Object并且SomeInterface看起来有相同的基本类型。但是,您的结论是有缺陷的,因为它假定存在 和 的基类型,ObjectSomeInterface该方法的文档明确指出情况并非如此。

于 2012-12-24T04:11:22.817 回答
4

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

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

于 2012-12-23T15:51:20.487 回答
4

typeof(object).BaseTypenull因为 MSDN的退货;

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());
            }
        }
    }
}

输出:

程序.IBar


接口从零个或多个基本接口继承;因此,null如果Type对象表示一个interface. 可以使用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());
            }
        }
    }
}

输出是:

程序.IFoo

程序.IBar


问题是,我们使用 typeof(object).BaseType 得到了 null。这可能意味着 System.Object 也是一个接口,不是吗?

不,System.Object不是接口。这是一个类。它支持 .NET Framework 类层次结构中的所有类。

于 2012-12-23T14:18:45.013 回答
3

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

于 2013-02-03T21:39:40.023 回答
1

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

不,该假设依赖于以下假设:

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

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

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

于 2013-05-05T08:59:15.483 回答