【问题标题】:Why does System.Exception shadow GetType()为什么 System.Exception 会影响 GetType()
【发布时间】:2013-05-19 03:24:38
【问题描述】:

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

经过更深入的检查,原来System.Exception shadows 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()?

【问题讨论】:

    标签: c# .net reflection gettype


    【解决方案1】:

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

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

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

    • 如果基类中的方法不是虚拟的,而是在同一个程序集中,偷偷摸摸的编译器实际上将它变成虚拟的和最终的

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

    【讨论】:

    • 是的 - 正是因为那篇帖子,我才发现了另一个 StackOverflow 问题。
    • 为什么会出现这个问题?
    • 我假设是出于性能原因。 GetType() 只会实现一个(由 CLR 提供),那么为什么要在 btable 中添加一个新条目以及为什么会导致虚拟方法的开销。
    【解决方案2】:

    查看 here 和 cmets here 以获得“长”答案。

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

    【讨论】:

    • 我不太确定为什么它必须new 它。您可以创建一个实现_Exception 的类,而无需隐藏GetType()。如第二个链接所述,CLR 似乎也不会自动实现它。
    • stackoverflow.com/a/3477588/1260405 这个帖子可能会回答这个问题。另外,System.Type 也是这样完成的,并且还实现了一个 com 接口。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2011-03-06
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多