3

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

经过更深入的检查,事实证明System.ExceptionGetType() 有阴影:

// 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() 呢?

4

2 回答 2

1

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

尖叫的答案中的第二个链接暗示了这一点,但是对另一个问题的回答更清楚了:

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

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

如果System.Exception没有隐藏 GetType(),则 Object 的 GetType() 实现将由编译器自动转换为虚拟方法。

于 2013-05-23T23:28:39.167 回答
0

在此处和此处的评论中查看“长”答案。

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

于 2013-05-23T17:47:34.313 回答