2009-07-03 7 views
16

Ich erhalte einen Kompilierfehler von der folgenden Eigenschaft.
Der Fehler ist:Zugriffsmodifizierer auf Schnittstellenelemente in C#

„Der Modifikator‚öffentlich‘ist nicht gültig für diesen Titel“

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

aber wenn ich die IWorkItemControl entfernen kompiliert es in Ordnung.

Warum erhalte ich diesen Fehler und was ist der Unterschied, wenn ich den Schnittstellennamen in der Signatur habe/habe?

Antwort

41

Explicit interface implementation können Sie keine Zugriffsmodifizierer angeben. Wenn Sie ein Schnittstellenelement explizit implementieren (indem Sie den Schnittstellennamen vor dem Elementnamen angeben), können Sie nur über diese Schnittstelle auf dieses Element zugreifen. Grundsätzlich, wenn Sie tun:

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

Sie können nicht tun:

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

Es gibt mehrere Anwendungsfälle für EII. Beispiel: Sie möchten eine Methode Close für Ihre Klasse bereitstellen, um erworbene Ressourcen freizugeben, aber dennoch IDisposable implementieren möchten. Sie tun können:

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

Auf diese Weise können die Verbraucher der Klasse Close nur direkt anrufen (und sie werden nicht einmal Dispose in Intellisense Liste), aber Sie können immer noch die Test Klasse verwenden, wo immer ein IDisposable erwartet wird (zB in einer using Anweisung).

für EII Ein weiterer Anwendungsfall ist für zwei Schnittstellen verschiedene Implementierungen eines gleichnamigen Schnittstelle Elements mit:

interface IOne { 
    bool Property { get; } 
} 

interface ITwo { 
    string Property { get; } 
} 

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

Wie Sie sehen, ohne EII ist es nicht einmal möglich beide Schnittstellen dieses Beispiels zu implementieren in eine einzelne Klasse (da sich die Eigenschaften nur im Rückgabetyp unterscheiden). In anderen Fällen möchten Sie möglicherweise über verschiedene Schnittstellen absichtlich unterschiedliche Verhaltensweisen für einzelne Ansichten einer Klasse bereitstellen.

0

Alle Elemente einer Schnittstelle müssen öffentlich sein. Schließlich ist eine Schnittstelle die öffentliche Ansicht eines Objekts.

Da Eigenschaften ist ein Element einer Schnittstelle IWorkItemControl es bereits öffentlich ist, und Sie können die Zugriffsebene nicht angeben, auch redundant zu spezifizieren, dass es öffentlich ist.

+1

Dies ist kein sehr starker Grund, da Sie für alle implizit implementierten Member noch manuell public angeben müssen. Wenn dies der Fall wäre, könnte der Compiler diese auch automatisch als öffentlich annehmen. –

+0

Das ist falsch, da Sie interne Schnittstellen haben können. –

Verwandte Themen