2

我有一个界面:

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

所有实现的对象Profile都有 aName和 an Alias,但有些限制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?)
4

2 回答 2

5

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

这不是真的。您正在课堂Profile.Alias内实施ConcreteProfile。在此上下文中,this指的是ConcreteProfile实例并且可用于访问ConcreteProfile实例的任何成员。

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

既然要访问,就Profile.Name必须投到.thisProfile

于 2016-03-16T23:07:49.460 回答
3

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

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

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

...

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

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