为什么我需要投出这个'在C#显式实现中接口类型?

时间:2016-03-16 22:48:46

标签: c# interface explicit-interface

我有一个界面:

public interface Profile
{
    string Name { get; }
    string Alias { get; set; }
}

实施Profile的所有对象都有NameAlias,但有些限制Alias,因此它始终与Name相同}。应用此限制的可以实现Alias,如下所示:

string Profile.Alias
{
    get
    {
        return ((Profile)this).Name;
    }
    set { }
}

由于显式接口实现的上下文中的this只能是Profile类型,并且我们知道它是通过Profile接口而不是包含类的接口或它实现的任何其他接口,为什么需要强制转换?

使用return this.Name;进行getter实现会导致此错误:

Type `ConcreteProfile' does not contain a definition for `Name' and no extension method `Name' of type `ConcreteProfile' could be found (are you missing a using directive or an assembly reference?)

2 个答案:

答案 0 :(得分:4)

  

由于显式接口实现的上下文中的this只能是Profile类型

事实并非如此。您正在Profile.Alias课程中实施ConcreteProfile。在此上下文中,this引用ConcreteProfile实例,可用于访问ConcreteProfile实例的任何成员。

例如,ConcreteProfile类可以包含不是Name的另一个Profile.Name属性。在这种情况下,this.Name将引用该属性。

由于您想要访问Profile.Name,您必须将this投射到Profile

答案 1 :(得分:3)

  

由于这在显式接口实现的上下文中只能是Profile类型,并且我们知道它是通过Profile接口而不是包含类或它实现的任何其他接口的接口访问的,为什么需要转换?

因为它使用显式接口实现。这只是显式接口实现所做的一部分 - 以及它如何实现消除那些本来不明确的调用的目标的一部分。从C#5规范,第13.4.1节:

  

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

     

...

     

显式接口成员实现有两个主要目的:

     
      
  • 由于无法通过类或结构实例访问显式接口成员实现,因此它们允许从类或结构的公共接口中排除接口实现。当类或结构实现对该类或结构的使用者不感兴趣的内部接口时,这尤其有用。
  •   
  • 显式接口成员实现允许使用相同签名消除接口成员的歧义。如果没有显式的接口成员实现,那么类或结构将不可能具有相同签名和返回类型的接口成员的不同实现,因为类或结构不可能在所有接口成员上具有任何实现。相同的签名但具有不同的退货类型。
  •