C#  
     interface ILeft{    int P { get;}}
    interface IRight{    int P();} C#  class Middle : ILeft, IRight
{    public int P() { return 0; }    
int ILeft.P { get { return 0; } }}以上代码是没问题的,我不明白的是在接口的实现中
public int P() { return 0; }  
int ILeft.P { get { return 0; } }
P()方法,如果用显式
public int IRight.P() { return 0; }  
int ILeft.P { get { return 0; } }
这样会报修饰符错,请问这是为什么?
以上红色字体是我从MSDN中摘录下来的,
对此我也疑惑,
为什么以下代码 class Middle : ILeft, IRight
{
    public int P() { return 0; }
    int ILeft.P { get { return 0; } }
}
的方法P不用显式接口限定为public int IRight.P() { return 0; } 
限定后如红色字体的问题,会报错??????

解决方案 »

  1.   


        interface ILeft { int P { get;} }
        interface IRight { int P();}    class Middle : ILeft, IRight
        {
             int IRight.P() { return 0; }//之所以不可以用public,是因为Middle的对象是无法访问此方法的(p方法)只能在把Middle的对象转换为IRight接口后才能访问此方法,如果加上了public,那么Middle对象肯定是可以访问的,所以就冲突了(因为显式实现的接口必须显式转换为接口后才能访问接口中的方法),显式实现接口在某种程度上讲,把接口和接口的方法“隐藏”起来了,在对象的实现中,显示实现的接口的方法被认为是“私有的”
             public int P { get { return 0; } }
        } 
      

  2.   

    C#  
        interface ILeft{    int P { get;}} 
        interface IRight{    int P();} C#  class Middle : ILeft, IRight 
    {    public int P() { return 0; }    
    int ILeft.P { get { return 0; } }} 以上代码是没问题的,为什么方法P前面加了public还是正确的???这段红色代码是MSDN上抄来的,也是别人发的代码,
      

  3.   

    我看了下,同名方法和属性P,实现的时候,一个限定了接口名,另一个没限定,我想同时限定应该也是可以的吧?原始代码中只限定了一个,系统可以自动识别另一个成员的实现代码吧,?我是这么理解的,不知道是否对,至于错误是否因为是修饰限定符,我看原始代码中只不过是一个用了publi,另外一个没家访问修饰符,照1楼的说法,前面是都不能加publi的,这就矛盾了?
      

  4.   


    难道显式属性P可以直接用类或类的实列调用吗?所以前面可以加public????
      

  5.   

    我写的例子中,P属性是直接可以用Middle对象来访问的,
    而IRight.p()方法却不可以用Middle的对象访问,这就是为什么使用显式属性的原因
      

  6.   


    class Middle : ILeft, IRight 
    {    public int P() { return 0; }  //由于接口的属性或方法必须公有,所以p方法前必须加public,否则错误,  
    int ILeft.P { get { return 0; } }} //在Middle对象中是不可见的,所以标识为了ILeft接口
      

  7.   


    你的意思就是说,使用了显式接口实现的方法或属性前都是不能加publi的吧?因为其在所属的CLASS中是不可见的,
    而没有使用显式接口实现的方法或属性是可以加publi的吧,对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧??
      

  8.   

    而没有使用显式接口实现的方法或属性是可以加publi的吧, 
    没有显式实现的方法/属性前一定要加public,因为接口中的成员都是公有的;对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧?? 
    这两个接口没有必然联系,所以互不影响
      

  9.   


    那么
    class Middle : ILeft, IRight 
    {    int IRight.P() { return 0; }    
          int ILeft.P { get { return 0; } }
    } 这样是否也是正确的?就是全部显式接口实现
      

  10.   


    显式接口实现的方法前之所以不可以用public,是因为显式接口实现的方法默认为公有的,所以语法规定了不能加任何修饰符,(见书<<零基础学c#3.0>>P125,机械工业出版社)但是我不明白,虽然定义接口时候,接口的方法前不能加修饰符,是默认为公有的,为什么在类中实现其方法时候前面一定要加public呢?加internal不可以吗?在本项目(程序集)内访问为什么不可以呢?
      

  11.   

    C# codeclass Middle : ILeft, IRight 
    {publicint P() {return0; }//由于接口的属性或方法必须公有,所以p方法前必须加public,否则错误,int ILeft.P {get {return0; } }}//在Middle对象中是不可见的,所以标识为了ILeft接口 你的意思就是说,使用了显式接口实现的方法或属性前都是不能加publi的吧?因为其在所属的CLASS中是不可见的, 
    而没有使用显式接口实现的方法或属性是可以加publi的吧, 对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧?? 
      

  12.   

    你想太多了...显式接口实现的成员都是属于接口实例而不是类实例的,所以无需加访问修饰符,事实上编译器也不允许加...而接口成员都必须是public的,所以以类实例成员实现的接口成员必须加public...显式接口实现只是用于解决同名成员的冲突和特殊情况下不想让类实例显示该成员这两种情况,并不是鼓励你用显式接口实现...也就是说除非不得己或就是想隐藏某个成员否则不应该使用显式接口实现...