为什么System.Exception阴影GetType()

时间:2013-05-23 16:46:00

标签: c# .net reflection gettype

在尝试比较两个dll进行API更改时,一位同事注意到某些类有两个GetType()方法。

经过深入检查,结果发现System.Exception阴影GetType():

// this method is required so Object.GetType is not made virtual by the compiler
public new Type GetType() 
{
  return base.GetType(); 
}

我看到System.Exception实现了_Exception,但是我没有看到为什么必须明确地遮蔽GetType的原因,因为它不会是虚拟的。

那么为什么System.Exception会影子GetType()?

2 个答案:

答案 0 :(得分:1)

我不确定它是否与尖叫所提到的COM有关,但它肯定与不使Object.GetType()虚拟有关。

尖叫的答案中的第二个链接提到了它,但this answer to another question使其更清晰:

  

CLR要求实现接口方法的所有方法都必须是虚拟的(Ecma 335 Partition II第12.1节)。

     
      
  • 如果基类中的方法不是虚拟,但是在同一个程序集中,那么偷偷摸摸的编译器实际上使其成为虚拟和最终的
  •   

如果System.Exception未影响GetType(),则Object的GetType()实现将由编译器自动转换为虚方法。

答案 1 :(得分:0)

查看here并在评论here中查找“长”答案。

简而言之,System.Exception实现了System.Runtime.InteropServices._Exception接口,该接口也具有GetType-Method,因此必须new - 实现GetType-Method。