为什么我能够覆盖Equals方法,如果我的类不继承任何东西?

Din*_*mar 12 .net c# oop inheritance

我对以下代码如何工作有点困惑

public class DefaultClass
{
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我不是继承任何类,但我仍然能够重写Equals方法.此代码在VS2010中完美编译.知道这是如何工作的吗?

Pat*_*man 32

因为你的DefaultClass'继承' object是默认的.

你现在压倒一切object.Equals.

我理解这种困惑.MSDN说像这样的类不继承任何其他类,但它确实(object):

继承:无.例:class ClassA { }

  • @Liran [并非一切都来自于对象.](http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx) (8认同)
  • 为了清楚起见,只想添加C#中的所有类型都继承自父类Object,这就是为什么你可以引用任何ref或value的所有实例来对象. (4认同)
  • @ScottChamberlain:恕我直言,混淆源于主要使用像"类型"这样的词来描述几个不同的相似但不同的概念.给定`var l = new List <int> {1,2,3}; var e1 = l.GetEnumerator(); IEnumerator <int> e2 = e1;`,`typeof(e1)`和`e2.GetType()`都会产生`List <Int32> .Enumerator`,但语义上`e1`和`e2`将是非常不同的类型:`e1`是一个值类型,`e2`是一个堆对象的引用.因此,`e1`将展示值类型语义,而`e2`将展示类类型语义.鉴于此,'e1`和`e2`真的是相同的"类型"? (3认同)
  • @ScottChamberlain - Eric Lippert提供的示例主要是指针或"模板"类型,两者都是可以理解的; 首先,指针在C#中公开,专门用于使C#代码与非托管代码互操作,就像编组不能覆盖的那样.他们在"日常"C#代码中也非常气馁.平均C#编码器更感兴趣的是接口和开放式泛型,这两者基本上都是"模板"; 它们不是可实例化的,因此不是对象,但它们定义了从Object派生的实例结构的规则. (2认同)

Rah*_*thi 9

Object类是所有类的父类,所有类都从它继承.所以你Default Class也继承了这个Object

这是.NET Framework中所有类的最终基类; 它是类型层次结构的根.

您可以使用树结构来理解这一点:

                     System.Object
                     /           \
                    /             \
                   /               \
SomeProject.DefaultClass        SomeProject.SomeOtherBaseClass
                                         /           \
                                        /             \
                                       /               \
                   SomeProject.ChildClass1       SomeProject.ChildClass2
Run Code Online (Sandbox Code Playgroud)

另请注意,请查看Eric Lippert撰写的这篇非常相关的文章,它可以帮助您理解Object类: - 并非所有内容都来自于对象