【问题标题】:Why do I need to cast 'this' to interface type in a C# explicit implementation?为什么我需要在 C# 显式实现中将“this”转换为接口类型?
【发布时间】:2016-03-16 22:48:45
【问题描述】:

我有一个界面:

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?)

【问题讨论】:

  • 为什么不简单地使用 string Alias => Name (c#6) 或 string Alias {get { return Name;}} ?
  • @Boo:因为它需要实现接口,它有一个setter。就我个人而言,我会让 setter 抛出异常,而不是忽略调用……或者重新设计界面。

标签: c# interface explicit-interface


【解决方案1】:

因为在显式接口实现的上下文中this 只能是Profile 类型

这不是真的。您正在 ConcreteProfile 类中实现 Profile.Alias。在这种情况下,this 指的是ConcreteProfile 实例,可用于访问ConcreteProfile 实例的任何成员。

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

既然你想访问Profile.Name,你必须把this转换成Profile

【讨论】:

    【解决方案2】:

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

    因为它使用显式接口实现。这只是显式接口实现的一部分——也是它如何实现消除歧义的目标的一部分,否则这些调用会模棱两可。来自 C# 5 规范,第 13.4.1 节:

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

    ...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2011-05-05
      • 2010-09-29
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多