为什么没有具有相同基类和派生类名的循环继承

时间:2011-08-19 10:29:15

标签: c# inheritance

今天就在other thread at SO,我发现了这个小代码片段,我填写了更多内容以使其完整,

class GameObject
{
    public virtual void Hello()
    {

        Console.WriteLine("Hello method in base class");
    }
}

class GameObjеct : GameObject 
{
    public override void Hello()
    {
        Console.WriteLine("Hello method in derived class");

    }

}

class Program
{

    public static void Main(string[] args)
    {
        GameObject obj = new GameObject();//Why i never can call Derived? Though c# allows it?
        obj.Hello();


        Console.ReadLine();
    }
}

现在按照上面的代码,CSC不会发出任何警告。但代码令人惊讶。

我使用ILDasm打开了IL代码,它显示派生类,即GameObject为'GameObject'名称,基类名称为''。

所以我的问题是

  1. 即使在运行时,编译器如何区分这两个类名?

  2. 如果使用ANSI编码粘贴在记事本上,我们会根据我的朋友Abhishek sur在derviced类名称中获得一个奇怪的字符。 http://twitpic.com/68co6z

  3. 由于

    编辑:使用不同的名称更新相同的代码,我从编译器收到错误。

    class XXXYYY
        {
            public virtual void Hello()
            {
    
                Console.WriteLine("Hello method in base class");
            }
        }
    
     class XXXYYY : XXXYYY
        {
            public override void Hello()
            {
                Console.WriteLine("Hello method in derived class");
    
            }
    
        }
    
        class Program
        {
    
            public static void Main(string[] args)
            {
                XXXYYY obj = new XXXYYY();//Why i never can call Derived? Though c# allows it?
                obj.Hello();
    
    
                Console.ReadLine();
            }
        }
    

3 个答案:

答案 0 :(得分:8)

基本上,第二个类名中看起来像“e”的字符是非ASCII字符。如果你将源代码放入一个带有支持它的编码的文本文件(例如UTF-8)并告诉C#编译器使用什么编码(默认情况下是UTF-8),那么它会将它们视为不同的类名

忽略非ASCII部分,真的只是类:

public class Hello {}

public class He11o : Hello {}

某些字体中,您可以分辨出小写字母和一个字体之间的区别,但在某些情况下,您不能。但他们的角色不同。

当您尝试将其粘贴到记事本中时,它失败了,因为您使用的ANSI编码(ANSI是一个含糊不清的术语)不包含该字符。

编辑:您的第二个代码段无法编译,原因很明显,您已经声明了两次相同的类名。不是两个看起来相同的不同名称,而是真正的同名

答案 1 :(得分:2)

如果我没有弄错,继承GameObject的GameObject类中的e不是ASCII e,而是一个特殊的字符。

答案 2 :(得分:1)

我的观点是:

1。

class GameObject

在IL中它是GameObject

2。

class GameObject:GameObject

在IL中它是'GameObject'

这两种类型在IL中都有所不同。

3。在Visual Studio IDE中,如果键入代码,则不会在GameObject中标识e。因此,源文件中必须存在一些ascii字符,这两个字符使两个类不同,当您复制和粘贴它时,它会完全显示出来。

这意味着您的类是不同的,因为两个Hello都是虚拟的,引用GameObject可以根据您传递的对象调用基本Hello和派生对象。