14

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"; }
    }
}
4

1 回答 1

8

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

  1. 用于优化 - 也许它为 JIT 编译器节省了一些工作。
  2. 为了可读性 - 使人眼在查看 MSIL 输出时更容易掌握类型实现的内容。
  3. 因为这就是暑期实习生实施它的方式,而且由于它运行良好,没有人会改变它以防万一它坏了。
于 2009-04-17T06:33:25.443 回答