显式接口实现,为什么显式转换

当一个类显式实现一个接口时,为什么需要将类实例显式地转换为接口才能使用已实现的方法?

(此示例取自此处: MSDN:显式接口实现 )

您有两个接口,如下所示。

interface IControl { void Paint(); } interface ISurface { void Paint(); } 

然后你明确地实现它们。

 public class SampleClass : IControl, ISurface { void IControl.Paint() { System.Console.WriteLine("IControl.Paint"); } void ISurface.Paint() { System.Console.WriteLine("ISurface.Paint"); } } 

现在,要使用这些接口,您需要以下代码。

 // Call the Paint methods from Main. SampleClass obj = new SampleClass(); //obj.Paint(); // Compiler error. IControl c = (IControl)obj; c.Paint(); // Calls IControl.Paint on SampleClass. ISurface s = (ISurface)obj; s.Paint(); // Calls ISurface.Paint on SampleClass. 

在上面的代码块中,为什么你有

 IControl c = (IControl)obj; 

而不是

 IControl c = obj; 

我混淆的原因是,例如,您可以执行以下操作

 IDictionary c = new Dictionary(); 

没有明确地将new DictionaryIDictionary

谢谢。

当一个类显式实现一个接口时,为什么需要将类实例显式地转换为接口才能使用已实现的方法?

就编译器而言,该成员实际上不存在于类中 – 它仅存在于接口上。 您不必显式强制转换 – 您只需要具有编译时类型的接口的引用。 这可以随心所欲地完成,包括隐式转换。

在上面的代码块中,为什么你有

 IControl c = (IControl)obj; 

而不是

 IControl c = obj; 

你不必。 隐式转换应该绝对正确。 您必须显式转换才能在单个表达式中调用该方法,例如

 obj.Paint(); // Invalid ((IControl) obj).Paint(); // Valid 

但是如果你通过赋值给接口类型的单独局部变量进行隐式转换,那很好 – 该方法仍然使用目标表达式调用,该目标表达式是接口类型。

仅当类型从多个接口inheritance并且某些方法在多个接口中具有相同的名称/签名时,才需要显式接口实现。

rest是优先事项和惯例。

 mpleClass obj = new SampleClass(); //obj.Paint(); // Compiler error. 

obj.Paint() – >这是错误,因为当显式接口实现完成时,底层接口实现需要在MSDN中指定的显式obj.Paint()

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