2010-12-15 3 views
6

Ho riscontrato un errore del compilatore che per me non ha alcun senso. Ho una proprietà internal e voglio limitare il blocco set in modo che sia disponibile solo tramite ereditarietà. Ho pensato che questo avrebbe funzionato:Modificatori di accesso sulle proprietà; perché il seguente lavoro non funziona?

internal bool MyProperty { 
    get { return someValue; } 
    protected internal set { someValue = value; } 
} 

Ma il compilatore dice che il modificatore di accesso sul blocco set deve essere più restrittiva rispetto internal - mi sto perdendo qualcosa, o è protected internalnon più restrittivo rispetto internal?

risposta

9

protected internal è meno restrittiva; è protetto o interno (non e), che pertanto inoltre consente alle sottoclassi di altri assembly di accedervi. Si avrebbe bisogno di invertire:

protected internal bool MyProperty { 
    get { return someValue; } 
    internal set { someValue = value; } 
} 

Questo permetterà codice nella vostra assemblea, più sottoclassi da altre assemblee, ottenere esso (lettura) -, ma solo il codice nella vostra assemblea possibile impostare esso (scrittura).

+0

grande spiegazione; ha perfettamente senso per me ora. –

2

No, è l'unione dei due, non l'intersezione; quindi protected internal è meno restrittivo di entrambi i singoli. L'intersezione non è una caratteristica di C#; il CLR supporta "Family AND Assembly", ma C# supporta solo "Family OR Assembly".

3

Dal documentation sull'accesso modificatori in C#:

Il livello di accessibilità interna protetta significa protette o interno, non protette e interna. In altre parole , un membro interno protetto può accedere a da qualsiasi classe nello stesso assembly , comprese le classi derivate. Per limitare l'accessibilità solo alle classi derivate nello stesso assembly, dichiarare la classe stessa interna e dichiarare i membri come protetti.


Per ottenere l'effetto desiderato, è invece necessario scambiare i modificatori di accesso, in questo modo:

protected internal bool MyProperty 
{ 
    get { return someValue; } 
    internal set { someValue = value; } 
} 
1

Qui, protected internal è meno restrittivo che internal.

  • protected internal - pubblico per il montaggio corrente e qualsiasi tipo che eredita questo tipo in altri assiemi.

  • internal - pubblico per questa assemblea e privati ​​per altre assemblee