为什么我不能在显式实现接口的类中调用方法?

tyr*_*302 37 c# explicit interface

这是故事.我创建了一个界面IVehicle.我明确地在我的类中实现了接口Vehicle.cs.

这是我的界面:

Interface IVehicle
{
        int getWheel();
}
Run Code Online (Sandbox Code Playgroud)

这是我的班级:

class Vehicle: IVehicle
{

     public int IVehicle.getWheel()
     {
         return wheel;
     }

     public void printWheel()
     {
         Console.WriteLine(getWheel());
     }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这getWheel()是明确实现的.现在,当我尝试在我的Vehicle类中调用该方法时,我收到一个错误,指示getWheel()当前上下文中不存在该错误.有人能帮助我理解我做错了什么吗?

tva*_*son 42

显式实现接口时,首先必须将对象强制转换为接口,然后才能调用该方法.换句话说,只有在对象上调用方法作为接口类型而不是具体类型时,该方法才可用.

class Vehicle: IVehicle {

     public int IVehicle.getWheel()
     {
         return wheel;
     }

     public void printWheel()
     {
         Console.WriteLine( ((IVehicle)this).getWheel() );
     }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅MSDN上的此参考.这是相关的片段:

在方法调用,属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现.显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用.

对于它的价值 - 这可能不是一个特别好的使用显式接口实现.通常,当您拥有一个具有典型操作的完整接口的类但是还实现可能取代其中某些操作的接口时,您希望使用显式实现.规范示例是一个File实现的类IDisposable.它会有一个Close()方法但需要实现Dispose().当File你用作治疗时Open/Close.但是,当在using语句中打开时,它会将其视为IDisposable和调用Dispose.在这种情况下Dispose只需打电话Close.您不一定要公开Dispose作为File实现的一部分,因为可以使用相同的行为Close.


Yur*_*ich 12

根据MSDN:

可以实现接口成员显式创建仅通过接口调用类成员,并且特定于该接口.

并且在C#语言规范中:

在方法调用,属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现.显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用.

要访问此成员,您可以先将类强制转换为接口,然后再访问它.