2

私はインターフェースを持っています:

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

実装するすべてのオブジェクトにProfileNameとがありますが、常に と同じになるようにAlias制限するものもあります。この制限を適用するものは、次のように実装できます。AliasNameAlias

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

this明示的なインターフェイス実装のコンテキスト内では、可能な型のみであり、それが実装されているクラスまたは他のインターフェイスではなく、インターフェイスProfileを介してアクセスされたことがわかっているため、キャストが必要なのはなぜですか?Profile

getter 実装に使用return this.Name;すると、次のエラーが発生します。

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、 にキャストthisする必要がありますProfile

于 2016-03-16T23:07:49.460 に答える
3

これは、明示的なインターフェイス実装のコンテキスト内では Profile 型になる可能性があり、それが実装するクラスや他のインターフェイスではなく、Profile インターフェイスを介してアクセスされたことがわかっているため、キャストが必要なのはなぜですか?

明示的なインターフェース実装を使用しているためです。これは、明示的なインターフェイスの実装が行うことの一部であり、そうでなければあいまいな呼び出しを明確にするという目的を達成する方法の一部です。C# 5 仕様のセクション 13.4.1 から:

メソッド呼び出し、プロパティ アクセス、またはインデクサー アクセスで、完全修飾名を使用して明示的なインターフェイス メンバーの実装にアクセスすることはできません。明示的なインターフェイス メンバーの実装は、インターフェイス インスタンスを介してのみアクセスでき、その場合は単にそのメンバー名によって参照されます。

...

明示的なインターフェイス メンバーの実装には、次の 2 つの主な目的があります。

  • 明示的なインターフェイス メンバーの実装は、クラスまたは構造体のインスタンスを介してアクセスできないため、クラスまたは構造体のパブリック インターフェイスからインターフェイスの実装を除外できます。これは、クラスまたは構造体が、そのクラスまたは構造体の消費者にとって重要ではない内部インターフェースを実装する場合に特に役立ちます。
  • 明示的なインターフェイス メンバーの実装により、同じシグネチャを持つインターフェイス メンバーのあいまいさを解消できます。明示的なインターフェイス メンバーの実装がなければ、クラスまたは構造体が同じシグネチャと戻り値の型を持つインターフェイス メンバーの異なる実装を持つことは不可能です。署名は同じですが、戻り値の型が異なります。
于 2016-03-16T23:03:24.487 に答える