Синглтон в C # "недоступен", когда не в том же пространстве имен? - PullRequest
5 голосов
/ 26 января 2011

Я попытался реализовать одноэлементный класс следующим образом (я использую VS2008 SP1):

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

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

Когда я хочу получить к нему доступ из класса в другом пространстве имен (кажется, что это проблема, в том же пространстве имен это работает), например:

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

Я получаю ошибку компилятора:

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

У кого-нибудь есть идеи, как это решить?

Большое спасибо заранее!

Ответы [ 6 ]

10 голосов
/ 26 января 2011

Вам не хватает ключевого слова public из определения класса.

3 голосов
/ 26 января 2011

Похоже, синглтон находится в другой сборке.Модификатор по умолчанию для класса является внутренним и поэтому доступен только в сборке.

2 голосов
/ 26 января 2011

изменение

class SingletonClass

до

public class SingletonClass

чтобы пометить его как общедоступный

или даже лучше:

public sealed class SingletonClass

поскольку члены являются статическими:

подробнее здесь

2 голосов
/ 26 января 2011

SingletonClass имеет внутреннюю видимость, поэтому, если два пространства имен находятся в разных сборках, весь класс недоступен.

Изменить

class SingletonClass

на

public class SingletonClass
1 голос
/ 26 января 2011

Ваш класс SingletonClass виден в других пространствах имен. Но это не видно в других сборках / проектах.

Ваш класс частный. Это означает, что весь код в вашем текущем проекте (= Assembly = .dll) может видеть этот класс. Однако этот класс скрыт для кода в других проектах.

Существует слабая корреляция между пространством имен и сборкой. Одно пространство имен может существовать в нескольких сборках, например, mscorlib.dll и System.dll оба содержат пространство имен System.

Но обычно, когда вы создаете новый проект в Visual Studio, вы получаете новое пространство имен.

Вы также можете добавить несколько пространств имен в одну сборку. Это происходит автоматически в Visual Studio при создании новой папки.

0 голосов
/ 26 января 2011

You SingletonClass класс не является общедоступным, поэтому не отображается вне пространства имен сборка .

Исправление : комментарии правильные, как говорится msdn :

Классы и структуры, которые не вложены в другие классы или структуры, могут быть открытыми или внутренними. Тип, объявленный как общедоступный, доступен любому другому типу. Тип, объявленный как внутренний, доступен только для типов в одной сборке . Классы и структуры объявляются как внутренние по умолчанию, если в определение класса не добавлено ключевое слово public, как в предыдущем примере. Определения класса или структуры могут добавить ключевое слово internal, чтобы сделать их уровень доступа явным. Модификаторы доступа не влияют на класс или саму структуру - у него всегда есть доступ к самому себе и ко всем его собственным членам.

...