Interface继承至System.Object?

   这其实是个很基础的问题,在我们学习C#类型的时候第一句就是所有的对象都继承至System.Object。今天一个同事问我Interface继承之System.Object。所以才有了本文。

  在这里我只从几个方面简单的说明:

  1:从语义:

     Interface在oo中表示一组行为的集合,是高层次的抽象,契约,一种稳定的表现。好比我们生活的公司和员工之间的合同,双方都必须遵循。所以我们的接口必须是一个干净纯洁的体系。加入interface继承之System.Object,这以为这是不是,Interface有Equal,ToString等方法?这明显破坏了接口的干净体系。

2:实践(C#):

   如果interface继承之System.Object,这我们可以从System.Type获取其基类:

如下测试:

public interface Itest{}

public class test{}

typeof(Itest).BaseTye//为null

typeof(test).BaseType//System.Object.

3:我们从IL指令来看(这也是最有力的证明):

我们先写一个接口和一个类,他们都是空实现:

namespace ConsoleApplication1 

    public class test 
    { 
    }

    public interface Itest 
    { 
    } 
}

 

在反编译查看IL:

test clas:

而interface Itest的IL:

从上面两个IL比较我们可以清晰的看出来class有显示的extends [mscorlib]System.Object,而接口没有,本篇的答案到这里你应该很清晰吧。这里还需要说明的是他们都是class,说明都是一种类型,而interface是一种特殊的类型。

接口能定义什么?接口能定义行为(方法),无参属性(属性,又称守信),有参属性(索引),不能定义私例字段,定义都是对编译器都是一组方法行为。

   在最后我们在来说说前面说的“所有的对象都继承至System.Object”,这是真的嘛?在c#的编译过程中为我们提供了一个选项NOAUTOINHERIT,是的我们可以为自定义类型去掉默认的System.Object的基类。这就打破了System.Object创世之祖的戒律。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/05/23/2514123.html

时间: 2024-09-18 00:36:10

Interface继承至System.Object?的相关文章

NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”

几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型"System.DateTime"强制转换为类型"System.Object".LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型. 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ValidateAn

linq-无法将“System.Int32”强制转换为“System.Object”LINQtoEntities 仅支持转换 EDM

问题描述 无法将"System.Int32"强制转换为"System.Object"LINQtoEntities 仅支持转换 EDM List result = relationDal.SearchRecord( m => m.ECategoryPropertyRelation_Id >= 0 m => m.ECategoryPropertyRelation_Id pageIndex pageSize desc out recordCount);

asp.net-System.Web.Mvc.HtmlHelper`1[System.Object]转换为System.Web.Mvc.HtmlHelper

问题描述 System.Web.Mvc.HtmlHelper`1[System.Object]转换为System.Web.Mvc.HtmlHelper 无法将System.Web.Mvc.HtmlHelper`1[System.Object] 的对象强制转换为类型 System.Web.Mvc.HtmlHelper ASP.NET MVC4 下使用DevExpress 开发的第三方控件出错 代码: @{ var grid = Html.DevExpress().GridView(settings

所有值类型继承自System.ValueType的疑惑

比如说int吧,是值类型,是个struct,是这样声明的 public struct Int32 : IComparable, IFormattable, IConvertible, IComparable, IEquatable 哪能看出来继承自ValueType?? 再说struct不是不能继承吗?为什么说继承自ValueType??不解.... 回答: ValueType的确是类类型,但是他的子类却是值类型,这是因为CLR对他的子类经过了特殊的处理.CLR若判断某类继承自ValueType

[你必须知道的.NET]第二十七回:interface到底继承于object吗?

说在,开篇之前 在.NET世界里,我们常常听到的一句话莫过于"System.Object是一切类型的根,是所有类型的父类",以至于我在<你必须知道的.NET>8.1节 以"万物归宗:System.Object"这样的title为System.Object授予至高荣誉.所以,基于这样的观点就有了下面这句"接口是否也继承于System.Object?",事实上这正是今天在技术群里小小讨论的一个插曲. 1 缘起 在.NET世界里,我们常常听

c#内存管理.

尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识.明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的.在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理. 当你在执行程序的时候内存中有两个地方用于存储程序变量.如果你还不知道,那么就来看看堆和栈的概念.堆和栈都是用于帮助我们程序运行的,包含某些特殊信息的操作系统内存模块.那么堆和栈有什么不同呢? 堆VS栈的区

C# Sharp Experience

C# 语言是一门简单,现代,优雅,面向对象,类型安全,平台独立的一门新型组件编程语言.其语法风格源自C/C++家族,融合了Visual Basic的高效和C/C++强大,是微软为奠定其下一互联网霸主地位而打造的Microsoft.Net平台的主流语言.其一经推出便以其强大的操作能 力,优雅的语法风格,创新的语言特性,第一等的面向组件编程的支持而深受世界各地程序员的好评和喜爱."它就是我多年来梦寐以求的计算机语言!"--很多 资深程序员拿到C#都是这样的惊讶.从C#语言的名字(C Sha

【教程】【转载】C#锐利体验(李建忠)—01

教程 C#锐利体验南京邮电学院 李建忠(cornyfield@263.net) C#语言是一门简单,现代,优雅,面向对象,类型安全,平台独立的一门新型组件编程语言.其语法风格源自C/C++家族,融合了Visual Basic的高效和C/C++强大,是微软为奠定其下一互联网霸主地位而打造的Microsoft.Net平台的主流语言.其一经推出便以其强大的操作能力,优雅的语法风格,创新的语言特性,第一等的面向组件编程的支持而深受世界各地程序员的好评和喜爱."它就是我多年来梦寐以求的计算机语言!&quo

C# 2.0 Specification(泛型五)

接泛型四20.6.5语法歧义在§20.9.3和§20.9.4中简单名字(simple-name)和成员访问(member-access)对于表达式来说容易引起语法歧义.例如,语句F(G<A,B>(7)); 可以被解释为对带有两个参数G<A和B>(7)的F的调用[1].同样,它还能被解释为对带有一个参数的F的调用,这是一个对带有两个类型实参和一个正式参数的泛型方法G的调用.如果表达式可以被解析为两种不同的有效方法,那么在">"能被解析作为运算符的所有或一部分