14

C# コンパイラは、それが実装するすべてのインターフェイスとその基本クラスを明示的に記録しているようです。CLI の仕様によると、これは必要ありません。他のコンパイラがこれを明示的に出力しないのを見たことがありますが、うまく動作しているようです。C#がこれを行う違いや理由はありますか?

下部の C# が B に対して生成する MSIL は次のとおりです。

.class private auto ansi beforefieldinit B
       extends A
       implements IAdvanced,
                  ISimple

A は IAdvanced と同様に実装するため、ISimple を指定する必要はありません。C# コード:

interface ISimple {
    int Basic { get;  }
    int Zero { get;  }
}
interface IAdvanced : ISimple {
    string Major { get; }
}
class A : ISimple {
    int ISimple.Basic {
        get { return 1; }
    }
    int ISimple.Zero {
        get{ return 0;}
    }
}
class B : A, IAdvanced {
    string IAdvanced.Major {
        get { return "B"; }
    }
}
4

1 に答える 1

8

コンパイラの開発者が立ち寄らない限り、ここで決定的な答えを知ることはできないと思います。ただし、理由については推測できます。かもしれない:

  1. 最適化のため - おそらく、JIT コンパイラーの作業を節約できます。
  2. 読みやすさのため - MSIL 出力を見たときに、型が何を実装しているかを人間の目で簡単に把握できるようにします。
  3. それが夏のインターンがそれを実装した方法であり、それがうまく機能するため、何かが壊れた場合に備えて誰もそれを変更しようとしないからです.
于 2009-04-17T06:33:25.443 に答える