就在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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在按照上面的代码,CSC不会发出任何警告.但代码令人惊讶.
我使用ILDasm打开了IL代码,它显示派生类,即GameObject为'GameObject'名称,基类名称为''.
所以我的问题是
即使在运行时,编译器如何区分这两个类名?
如果粘贴在带有ANSI编码的记事本上,我们会根据我的朋友Abhishek sur获得一个奇怪的字符.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();
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,第二个类名中看起来像"e"的字符是非ASCII字符.如果你将源代码放入一个带有支持它的编码的文本文件(例如UTF-8)并告诉C#编译器使用什么编码(默认情况下是UTF-8),那么它会将它们视为不同的类名.
忽略非ASCII部分,这实际上只是类:
public class Hello {}
public class He11o : Hello {}
Run Code Online (Sandbox Code Playgroud)
在某些字体中,您可以区分小写字母和一个字体,但在某些字体中您不能.但他们的角色不同.
当您尝试将其粘贴到记事本中时失败,因为您正在使用的ANSI编码(ANSI是一个含糊不清的术语)不包含该字符.
编辑:您的第二个代码段不能编译,原因很明显,您已经声明了两次相同的类名.不是两个看起来相同的名字,而是真正相同的名字.
| 归档时间: |
|
| 查看次数: |
1066 次 |
| 最近记录: |