3

API の変更について 2 つの dll を比較しようとしているときに、ある同僚が、一部のクラスに 2 つの GetType() メソッドがあることに気付きました。

さらに詳しく調べると、System.ExceptionGetType() が影になっていることがわかります。

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

_ExceptionをSystem.Exception実装していることがわかりますが、とにかく仮想ではないため、GetType を明示的にシャドウする必要がある理由がわかりません。

では、なぜ System.Exception は GetType() をシャドウするのでしょうか?

4

2 に答える 2

1

叫び声で言及されているように、COMと関係があるかどうかはわかりませんが、Object.GetType()を仮想化しないことに関係していることは間違いありません。

シュリークの回答の2番目のリンクはそれをほのめかしていますが、別の質問に対するこの回答はそれをより明確にします:

CLR では、インターフェイス メソッドを実装するすべてのメソッドが仮想である必要があります ( Ecma 335 パーティション IIセクション 12.1)。

  • 基本クラスのメソッドがvirtual ではなく、同じアセンブリ内にある場合、卑劣なコンパイラは実際にそれを virtual および final にします。

GetType() をシャドウしない場合System.Exception、Object の GetType() 実装は、コンパイラによって自動的に仮想メソッドに変換されます。

于 2013-05-23T23:28:39.167 に答える
0

「長い」答えについては、こちらとコメントをご覧ください

つまり、GetType-Method も持つインターフェイスをSystem.Exception実装するため、GetType-Method を実装する必要があります。System.Runtime.InteropServices._Exceptionnew

于 2013-05-23T17:47:34.313 に答える