2009-07-03 13 views
16

Viene visualizzato un errore di compilazione dalla seguente proprietà.
L'errore è:Modificatori di accesso sui membri dell'interfaccia in C#

"Il modificatore 'pubblico' non è valido per questo articolo"

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

ma se mi tolgo la IWorkItemControl si compila bene.

Perché sto ricevendo questo errore e qual è la differenza di avere/non avere il nome dell'interfaccia nella firma?

risposta

41

Explicit interface implementation non consente di specificare alcun modificatore di accesso. Quando si implementa esplicitamente un membro dell'interfaccia (specificando il nome dell'interfaccia prima del nome del membro), è possibile accedere a quel membro utilizzando solo tale interfaccia. In sostanza, se si fa:

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

non si può fare:

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

Ci sono diversi casi di utilizzo per EII. Ad esempio, si desidera fornire un metodo Close per la classe per liberare risorse acquisite ma si desidera comunque implementare IDisposable. Si potrebbe fare:

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

In questo modo, i consumatori della classe possono chiamare solo Close direttamente (e non saranno nemmeno vedere Dispose nella lista Intellisense), ma è comunque possibile utilizzare la classe Test ovunque ci si aspetta un IDisposable (ad esempio in una dichiarazione using).

Un altro caso d'uso per EII sta fornendo diverse implementazioni di un membro di interfaccia lo stesso nome per due interfacce:

interface IOne { 
    bool Property { get; } 
} 

interface ITwo { 
    string Property { get; } 
} 

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

Come si vede, senza EII E 'nemmeno possibile implementare entrambe le interfacce di questo esempio in una singola classe (poiché le proprietà differiscono solo nel tipo restituito). In altri casi, potresti volere intenzionalmente fornire un comportamento diverso per le singole visualizzazioni di una classe attraverso interfacce diverse.

0

Tutti gli elementi di un'interfaccia devono essere pubblici. Dopo tutto, un'interfaccia è la vista pubblica di un oggetto.

Dal Proprietà è un elemento di un'interfaccia IWorkItemControl, è già di dominio pubblico, e non è possibile specificare il livello di accesso, anche per specificare in modo ridondante che è pubblico.

+1

Questo non è un motivo molto forte, poiché è ancora necessario specificare manualmente il pubblico per tutti i membri implementati implicitamente. Se così fosse, il compilatore potrebbe automaticamente assumere anche quelli pubblici. –

+0

Questo è sbagliato, dal momento che è possibile avere interfacce interne. –