为什么C#编译器显式声明类型实现的所有接口?

时间:2009-04-17 06:07:14

标签: c# .net clr cil

C#编译器似乎明确地记下了它的所有接口,并且它的基类实现了。 CLI规范说这不是必要的。我已经看到其他一些编译器没有明确地发出它,它似乎工作正常。 C#是否存在差异或原因?

底部的C#为B生成的MSIL是:

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

它不需要指定ISimple,因为A和IAdvanced一样实现它。 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"; }
    }
}

1 个答案:

答案 0 :(得分:8)

我不认为我们可以在这里知道任何明确的答案,除非我们让编译器开发人员介入。但是,我们可以猜测原因。它可能是:

  1. 用于优化 - 也许它为JIT编译器节省了一些工作。
  2. 为了便于阅读 - 让人眼更容易掌握类型在查看MSIL输出时所实现的内容。
  3. 因为这就是夏季实习生如何实施它并且因为它工作正常,所以没有人会改变它以防万一它会破坏。