16

次のプロパティからコンパイル エラーが発生します。
エラーは次のとおりです。

「修飾子 'public' はこのアイテムには無効です」

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

しかし、削除するIWorkItemControlと正常にコンパイルされます。

このエラーが発生するのはなぜですか? また、署名にインターフェイス名がある場合とない場合の違いは何ですか?

4

2 に答える 2

41

明示的なインターフェイスの実装では、アクセス修飾子を指定できません。インターフェイス メンバーを (メンバー名の前にインターフェイス名を指定して) 明示的に実装すると、そのインターフェイスを使用してのみそのメンバーにアクセスできます。基本的に、次の場合:

System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

あなたはできません:

MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface

EII にはいくつかの使用例があります。たとえば、Close取得したリソースを解放するメソッドをクラスに提供したいが、それでも を実装したいとしますIDisposable。あなたがすることができます:

class Test : IDisposable {
    public void Close() {
        // Frees up resources
    }
    void IDisposable.Dispose() {
        Close();
    }
}

Closeこのように、クラスのコンシューマーは直接呼び出すことしかできませんが ( DisposeIntellisense リストにも表示されません)、期待される場所 (ステートメントなど)でTestクラスを使用できます。IDisposableusing

EII のもう 1 つのユース ケースは、2 つのインターフェイスに対して同じ名前のインターフェイス メンバーの異なる実装を提供することです。

interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

class Test : IOne, ITwo {
   bool IOne.Property { ... }
   string ITwo.Property { ... }
}

ご覧のとおり、EII がなければ、この例の両方のインターフェースを単一のクラスに実装することさえできません(プロパティは戻り値の型だけが異なるため)。また、別のインターフェイスを介して、クラスの個々のビューに対して意図的に異なる動作を提供したい場合もあります。

于 2009-07-03T05:01:17.800 に答える
0

インターフェイスのすべての要素はパブリックである必要があります。結局のところ、インターフェイスオブジェクトのパブリック ビューです。

PropertiesはインターフェイスIWorkItemControlの要素であるため、既に公開されており、そのアクセス レベルを指定することはできず、公開であることを冗長に指定することさえできません。

于 2009-07-03T05:28:03.017 に答える