在尝试比较两个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()?
答案 0 :(得分:1)
我不确定它是否与尖叫所提到的COM有关,但它肯定与不使Object.GetType()虚拟有关。
尖叫的答案中的第二个链接提到了它,但this answer to another question使其更清晰:
CLR要求实现接口方法的所有方法都必须是虚拟的(Ecma 335 Partition II第12.1节)。
- 如果基类中的方法不是虚拟,但是在同一个程序集中,那么偷偷摸摸的编译器实际上使其成为虚拟和最终的。
如果System.Exception
未影响GetType(),则Object的GetType()实现将由编译器自动转换为虚方法。
答案 1 :(得分:0)