¿Por qué se protege interna no más restrictiva que la interna?
-
21-08-2019 - |
Pregunta
Me gustaría crear un auto-propiedad interna:
internal bool IP { get; protected internal set; }
pensé que sería posible hacer que el colocador protected
o protected internal
- pero siempre me sale el error modificador de la accesibilidad debe ser más restrictiva que la propiedad . ¿No es ese el caso? Private
no me ayuda, aquí.
EDIT:
La pregunta es:? ¿Cómo se implementa un auto-propiedad con un captador interno y un regulador protegido
Solución
es efectivamente protected
o internal
, no y . Es accesible ambos por clases y tipos derivados en el mismo conjunto. Es un error común pensar protected internal
significa accesible sólo para las clases derivadas en el mismo conjunto.
Otros consejos
A nivel NET, hay dos niveles de acceso similares pero distintas:
- FamilyAndAssembly: más restrictiva que sea protegido o interna
- FamilyOrAssembly: menos restrictivo que sea protegido o interna
"protegido interno" en C # significa FamilyOrAssembly; no hay modificador para FamilyAndAssembly.
Por lo tanto, su protected internal
colocador es menos restrictivo que el internal
propiedad en general. Lo que podría hacer es:
protected internal bool IP { internal get; set; }
Pero entonces su colocador es menos restrictivo que el comprador, lo cual es extraño ...
Otra alternativa (algo equivalente) es:
internal bool IP { get; set; }
protected void SetIP(bool ip)
{
this.IP = ip;
}
Me parece que es hacer trampa, ya que Eric Lippert está en él mismo, pero escribió una excelente entrada en el blog que tiene en cuenta este problema.
Por qué no puedo acceder a un miembro protegido de una clase derivada, Tercera parte
En última instancia, su respuesta es en gran parte los mismos que los dados por los carteles aquí, sino que los anuncios un razonamiento interesante detrás del desgin de la lengua y la aplicación de estas características.
Teniendo en cuenta lo mencionado Jon Skeet (y el comentario de user59808), ¿no sería esto lograr el resultado deseado?
protected internal bool IP { get; protected set; }
protected internal
es menos restrictivo que sea protected
o internal
porque permite tanto sus subclases (<=>) y nada en el mismo conjunto (<=>) para acceder a algo.
medios internos protegidas visibles a las clases en el mismo conjunto, o a las clases derivadas de la clase que contiene - en otras palabras, es visible a los que cumplen los requisitos internos o los requisitos protegidas, no Y. No hay ningún modificador de acceso protegido y significado interno de esta manera.
medios interna protegida protegido o interna, no protegido e interna. Así alcance está limitado a la misma montaje o derivados clases, no necesariamente ambos.
modificador de accesibilidad debe ser más restrictiva que la propiedad
Interno es más restrictiva que protegía:. Porque las cosas protegidas se pueden ver (por subclases) el exterior del conjunto
El compilador está diciendo que no tiene sentido en decir que set
está protegida (es decir, visible a las subclases el exterior del conjunto), cuando todo el IP
propiedad es interna (es decir, invisible el exterior del conjunto).