摘要
typeof(ISomeInterface).BaseType
是null
;根据定义,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
打破了这一假设。这似乎说0
是1
的一个因素,但不是任何其他数字。
此外,如果我们使用方法递归查找SomeType
的基本类型,我们不能总是说SomeType
不是一个类,因为BaseType
是null
,typeof(object).BaseType
也是null
。
如果
,这似乎是矛盾的typeof(object).BaseType==typeof(object) -> true
表明它的基本类型本身,但实际上并不是实体和合同之间的区别?
更新:
我最初说过:
这可能意味着
System.Object
也是一个界面,不是吗?
我想说的是似乎很困惑。这是我表达不好的描述的错,并且很抱歉导致答案集中在那上面。
答案 0 :(得分:7)
Classes和Interfaces是两回事。以下表达式:
typeof(object).BaseType == typeof(SomeInterface).BaseType
之所以如此,只是因为以下情况也是如此:
null == null
根据定义,如果当前类型表示对象类或接口,BaseType将返回null。
这可能意味着System.Object也是一个接口,不是吗?
实际上不是,因为接口只包含方法的签名,而不包含它们的实现。您可以将接口视为类必须实现的契约。
答案 1 :(得分:6)
BaseType
属性返回 a 基类型的类型的基类型。对于所有其他类型,它返回一个值,指示该类型没有 a 基类型。您在原始问题中提出了以下表达式:
typeof(object).BaseType == typeof(SomeInterface).BaseType
然后您建议由于此表达式为真,Object
和SomeInterface
似乎具有相同的基本类型。但是,您的结论存在缺陷,因为它假定Object
和SomeInterface
都存在基类型,而该方法的文档明确指出不是这种情况。
答案 2 :(得分:4)
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
。可以使用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类层次结构中的所有类。
答案 3 :(得分:4)
请注意:接口不是类和结构的意义上的类型!接口本身并不存在。
类和结构是数据(代码)的类型,但接口是类型的类型。它们可用于分类其他类型。他们强迫其他类型遵循协议,仅此而已。它们只是一种布局,一种定义,一种契约;不是现有的东西。
答案 4 :(得分:3)
.net中有许多类型是“特殊的”,包括System.Object
,System.ValueType
和System.Enum
,它们在继承层次结构中的行为是唯一的。例如,从T
派生的任何类型System.ValueType
都是值类型,除非T
是System.ValueType
或System.Enum
,两者都是类类型。缺少Object
的基本类型可能会以类似的方式查看 - 缺少基本类型的每种类型都是一个接口,除了System.Object
这是一个古怪的。
答案 5 :(得分:1)
“它可以(语义上)意味着System.Object也是一个接口, 不是吗?“
不,这种假设依赖于这些假设:
当typeof(object).BaseType
返回null
时,并不意味着基类型为null
,这意味着根本没有基类型。因此,当typeof(ISomeInterface).BaseType
也返回null
时,并不意味着它与object
具有相同的基本类型,这意味着它根本没有基本类型。
即使object
和接口具有相同的基本类型,也不意味着object
是一个接口。例如,int
和double
类型具有相同的基本类型,但这并不意味着它们是相同的。