5

Me trataron de implementar una clase de singleton de la siguiente manera (yo uso VS2008 SP1):Singleton en C# "inaccesible" cuando no está en el mismo espacio de nombres?

namespace firstNamespace 
{ 
    class SingletonClass 
    { 
     private SingletonClass() {} 

     public static readonly SingletonClass Instance = new SingletonClass(); 
    } 
} 

Cuando quiero acceder a él desde una clase en un espacio de nombres diferente (parece que este es el problema, en el mismo espacio de nombres funciona) como:

namespace secondNamespace 
{ 
    ... 
    firstNamespace.SingletonClass inst = firstNamespace.SingletonClass.Instance; 
    ... 
} 

me sale un error de compilación:

error CS0122: 'firstNamespace.SingletonClass' is inaccessible due to its protection level 

¿alguien tiene una idea de cómo resolver esto?

¡Muchas gracias de antemano!

+0

muchas gracias a todos por sus respuestas rápidas y útiles! –

Respuesta

10

Te falta la palabra clave public de la definición de tu clase.

-1

Usted SingletonClass clase no es pública, por lo que no es visible fuera del espacio de nombres de montaje .

Corrección: los comentarios son rectos, como dice msdn:

Classes and structs that are not nested within other classes or structs can be either public or internal. A type declared as public is accessible by any other type. A type declared as internal is only accessible by types within the same assembly. Classes and structs are declared as internal by default unless the keyword public is added to the class definition, as in the previous example. Class or struct definitions can add the internal keyword to make their access level explicit. Access modifiers do not affect the class or struct itself — it always has access to itself and all of its own members.

+1

El espacio de nombre no es relevante para la visibilidad interna, el ensamblaje en el que se declara la clase es. –

+0

ES visible fuera del espacio de nombres. –

2

El SingletonClass tiene visibilidad interna, por lo que si los dos espacios de nombres están en diferentes montajes, toda la clase en inaccesible.

Cambio

class SingletonClass 

a

public class SingletonClass 
3

suena más como el singleton se encuentra en un montaje diferente. El modificador predeterminado para una clase es interno y, por lo tanto, solo se puede acceder al ensamblado.

2

cambio

class SingletonClass 

a

public class SingletonClass 

para marcarlo pública, por lo tanto accesible

o incluso mejor:

public sealed class SingletonClass 

ya que los miembros son estáticos:

more here

1

Usted clase SingletonClass es visible en otros espacios de nombres. Pero no es visible en otras Asambleas/Proyectos.

Tu clase es privada. Esto significa que todo el código en su proyecto actual (= Assembly = .dll) puede ver esta clase. Sin embargo, la clase está oculta para el código en otros proyectos.

Existe una débil correlación entre el espacio de nombres y el conjunto. Un espacio de nombre puede existir en varios ensamblados, por ejemplo, mscorlib.dll y System.dll contienen el espacio de nombres del sistema.

Pero normalmente, cuando crea un nuevo proyecto en Visual Studio, obtiene un nuevo espacio de nombres.

También puede agregar varios espacios de nombres al único Conjunto. Esto ocurre automáticamente en Visual Studio cuando crea una nueva carpeta.

+0

gracias por aclarar: soy nuevo en esto. –

Cuestiones relacionadas