【发布时间】:2011-04-20 03:50:55
【问题描述】:
无法解释以下程序发生了什么。 GetType 正在返回我想要返回的类型,而不是原始类型。这是否意味着我们不能依赖 GetType? is 运算符是正确的。谁能详细解释一下?
using System;
namespace ConsoleApplication2
{
public class MyClass
{
public Type GetType()
{
return typeof(Program);
}
}
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
if (mc.GetType() == typeof(Program))
{
Console.WriteLine("Confused.");
}
if(mc is Program)
{
Console.WriteLine(mc.GetType()); // Don't get inside the if. Why?
}
}
}
}
更新:我正在阅读《CLR via C# 3rd edition》一书。在第 4 章(第 2 页)中,当它解释 System.Object 中的不同方法时,它说
"GetType 方法是非虚拟的, 这可以防止一个类覆盖这个 方法并对其类型撒谎”
虽然我同意第一个陈述,但我在 MyClass 类型上撒谎。我不是吗?
【问题讨论】:
-
你能确认这里的混淆是 mc.GetType() == typeof(Program) 实际上计算为 true 吗?
-
是的。实际上,操作员似乎使用了一些与 GetType() 不同的机制来检查类型。如果是,机制是什么?上面的程序还表明我们不能相信 GetType 会返回正确的类型。
-
我认为您对创建new 方法(隐藏祖先方法)和覆盖 祖先方法之间的区别感到困惑。 Eric Lippert 最近有a blog article 涉及到这一点(可能还有其他人,但这是我能找到的第一个)。阅读它可能会帮助您了解这里发生了什么。
-
我明白发生了什么。但我的问题 1. 为什么 'is' 运算符不使用 GetType?如果答案是 GetType(当直接在对象上调用而不像 ((object)mc).GetType() 时)不能保证返回正确的类型,那么 GetType 在我们的代码中的用途是什么。这是否意味着在任何依赖 GetType 获取未知对象的代码中都可以被愚弄?