gpt4 book ai didi

c# - GetType 返回的信息不同于运算符(operator)使用的信息

转载 作者:行者123 更新时间:2023-11-30 19:07:43 26 4
gpt4 key购买 nike

无法解释以下程序的运行情况。 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?
}

}
}
}

更新:我正在通过 C# 阅读 CLR 这本书第 3 版。在第 4 章(第 2 页)中,当它解释 System.Object 中的不同方法时,它说

"The GetType method is nonvirtual, which prevents a class overriding this method and lying about its type"

虽然我同意第一个陈述,但我在 MyClass 类型方面撒谎。不是吗?

最佳答案

is operator implemented in terms of as operator最后使用 isinst IL指令。当然,此指令不知道您在继承层次结构中的某个类中定义的非虚拟 GetType 方法。

要理解这种“令人困惑”的行为,让我们“实现”我们自己的“is 运算符”版本:

public class MyClass
{
public Type GetType()
{
return typeof(Program);
}

}

class Program {

//this is oversimplified implementation,
//but I want to show the main differences
public static bool IsInstOf(object o, Type t)
{
//calling GetType on System.Object
return o.GetType().IsAssignableFrom(t);
}

static void Main(string[] args)
{
MyClass mc = new MyClass();

//calling MyClass non-virtual version for GetType method
if (mc.GetType() == typeof(Program))
{
//Yep, this condition is true
Console.WriteLine("Not surprised!");
}

//Calling System.Object non-virtual version for GetType method
if (IsInstOf(mc, typeof(Program)))
{
//Nope, this condition isn't met!
//because mc.GetType() != ((object)mc).GetType()!
}

Console.ReadLine();
}
}

关于c# - GetType 返回的信息不同于运算符(operator)使用的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com