今天就在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'名称,基类名称为''。
所以我的问题是
即使在运行时,编译器如何区分这两个类名?
如果使用ANSI编码粘贴在记事本上,我们会根据我的朋友Abhishek sur在derviced类名称中获得一个奇怪的字符。 http://twitpic.com/68co6z
由于
编辑:使用不同的名称更新相同的代码,我从编译器收到错误。
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();
}
}
答案 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和派生对象。