Restrições ao uso de níveis de acessibilidade (Referência em C#)
Quando você especifica um tipo em uma declaração, verifique se o nível de acessibilidade do tipo é dependente do nível de acessibilidade de um membro ou de outro tipo. Por exemplo, a classe base direta deve ser, pelo menos, tão acessível quanto a classe derivada. As seguintes declarações causam um erro do compilador porque a classe base BaseClass
é menos acessível que a MyClass
:
class BaseClass {...}
public class MyClass: BaseClass {...} // Error
A tabela a seguir resume as restrições nos níveis de acessibilidade declarada.
Contexto | Comentários |
---|---|
Classes | A classe base direta de um tipo de classe deve ser, pelo menos, tão acessível quanto o próprio tipo de classe. |
Interfaces | As interfaces base explícitas de um tipo de interface devem ser, pelo menos, tão acessíveis quanto o próprio tipo de interface. |
Representantes | O tipo de retorno e os tipos de parâmetro de um tipo delegado devem ser, pelo menos, tão acessíveis quanto o próprio tipo delegado. |
Constantes | O tipo de uma constante deve ser, pelo menos, tão acessível quanto a própria constante. |
Fields | O tipo de um campo deve ser, pelo menos, tão acessível quanto o próprio campo. |
Métodos | O tipo de retorno e os tipos de parâmetro de um método devem ser, pelo menos, tão acessíveis quanto o próprio método. |
Propriedades | O tipo de uma propriedade deve ser, pelo menos, tão acessível quanto a propriedade em si. |
Eventos | O tipo de um evento deve ser, pelo menos, tão acessível quanto o próprio evento. |
Indexadores | O tipo e os tipos de parâmetro de um indexador devem ser, pelo menos, tão acessíveis quanto o próprio indexador. |
Operadores | O tipo de retorno e os tipos de parâmetro de um operador devem ser, pelo menos, tão acessíveis quanto o próprio operador. |
Construtores | Os tipos de parâmetro de um construtor devem ser, pelo menos, tão acessíveis quanto o próprio construtor. |
Exemplo
O exemplo a seguir contém declarações incorretas de tipos diferentes. O comentário que segue cada declaração indica o erro do compilador esperado.
// Restrictions on Using Accessibility Levels
// CS0052 expected as well as CS0053, CS0056, and CS0057
// To make the program work, change access level of both class B
// and MyPrivateMethod() to public.
using System;
// A delegate:
delegate int MyDelegate();
class B
{
// A private method:
static int MyPrivateMethod()
{
return 0;
}
}
public class A
{
// Error: The type B is less accessible than the field A.myField.
public B myField = new B();
// Error: The type B is less accessible
// than the constant A.myConst.
public readonly B myConst = new B();
public B MyMethod()
{
// Error: The type B is less accessible
// than the method A.MyMethod.
return new B();
}
// Error: The type B is less accessible than the property A.MyProp
public B MyProp
{
set
{
}
}
MyDelegate d = new MyDelegate(B.MyPrivateMethod);
// Even when B is declared public, you still get the error:
// "The parameter B.MyPrivateMethod is not accessible due to
// protection level."
public static B operator +(A m1, B m2)
{
// Error: The type B is less accessible
// than the operator A.operator +(A,B)
return new B();
}
static void Main()
{
Console.Write("Compiled successfully");
}
}
Especificação da linguagem C#
Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.