如何==运算符与System.Type一起使用

时间:2014-10-06 07:32:48

标签: c#

typeof(int) == typeof(int)

此表达式如何评估??

当我使用

Console.WriteLine(typeof(int));

使用System.Int32对象方法输出ToString()。所以我假设在这个表达式中

 typeof(int) == typeof(int)

ToString()将两者都转换为System.Int32,然后比较它们的字符串。这是真的吗?

或其他事情发生

4 个答案:

答案 0 :(得分:3)

没有。与其他类通常一样,它使用相等比较器(==System.Type覆盖,并在两个实例之一上使用Equals方法检查它们的相等性。

typeof(int)会返回Type,因此会调用Type.Equals。您可以看到来源here

您将看到它最终使用它来比较两个实例:

return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));

答案 1 :(得分:2)

typeof()运算符解析为System.Type== 上的System.Type运算符检查引用相等性。这对于System.Type来说已经足够了,因为这个保证:

表示类型的Type对象是唯一的;也就是说,当且仅当它们表示相同类型时,两个Type对象引用引用同一对象。这允许使用引用相等性来比较Type对象。

http://msdn.microsoft.com/en-us/library/42892f65.aspx

所以答案是,==检查两种类型是否引用内存中完全相同的对象,如果原始对象属于同一类型,则它们的类型保证引用内存中的同一对象,因为以上引用。

答案 2 :(得分:1)

typeof(int) == typeof(int)的IL代码是

IL_0000:  ldtoken     System.Int32
IL_0005:  call        System.Type.GetTypeFromHandle
IL_000A:  ldtoken     System.Int32
IL_000F:  call        System.Type.GetTypeFromHandle
IL_0014:  call        System.Type.op_Equality

您可以看到它调用静态相等运算符

public static bool operator ==(Type left, Type right)

我们无法看到此方法在reference source中的作用,因为它显然是一种外部方法,但我的猜测是调用Equals方法或执行类似操作本机代码中的比较。

答案 3 :(得分:0)

Console.WriteLine(object);打印string的事实并不意味着Type类型总是一个字符串,类似于您打印出来的方式没有通过int方法查看和比较int ToString的{​​{1}}值。

==运算符将测试类型的相等性,并且绝不会触及ToString()

我认为你有点困惑 - 如果我不得不猜测 - 在打印内容和将其保存在内存之间的区别。