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

时间:2013-11-06 15:44:47

标签: c#

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

(这个例子来自这里:MSDN: Explicit Interface Implementation

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

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<string, string> c = new Dictionary<string, string>();

没有明确地将new Dictionary投射到IDictionary

感谢。

2 个答案:

答案 0 :(得分:17)

  

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

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

  

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

IControl c = (IControl)obj;
     

而不是

IControl c = obj;

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

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

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

答案 1 :(得分:2)

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

休息是优先事项和惯例。

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

obj.Paint() - &gt;这是错误,因为当完成显式接口实现时,底层接口实现需要 MSDN中指定的显式强制转换

  
    

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