Пользователь '<method>' не может получить доступ с ссылкой на экземпляр

Я попадаю на С#, и у меня возникает эта проблема:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

У меня есть этот код в UserControl:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

Все работает нормально, за исключением случаев, когда я перехожу к доступу Property1. Intellisense только дает мне "Equals, GetHashCode, GetType и ToString" в качестве параметров. Когда я нажимаю над oItem.Property1, Visual Studio дает мне это объяснение:

Member MyDataLayer.Section1.MyClass.MyItem.Property1.get cannot be accessed with an instance reference, qualify it with a type name instead

Я не уверен, что это значит, я сделал некоторые поисковые запросы, но не смог понять это.

Ответ 1

В С#, в отличие от VB.NET и Java, вы не можете получить доступ к static членам с синтаксисом экземпляра. Вы должны сделать:

MyClass.MyItem.Property1

чтобы ссылаться на это свойство или удалить модификатор static из Property1 (это то, что вы, вероятно, захотите сделать). Для концептуального представления о static см. Мой другой ответ.

Ответ 2

Вы можете получить доступ только к статическим членам, используя имя типа.

Поэтому вам нужно либо написать,

MyClass.MyItem.Property1

Или (возможно, это то, что вам нужно сделать) сделать Property1 свойство экземпляра, удалив ключевое слово static из его определения.

Статические свойства распределяются между всеми экземплярами их класса, так что они имеют только одно значение. То, как оно определено сейчас, не имеет смысла делать какие-либо экземпляры вашего класса MyItem.

Ответ 3

У меня была такая же проблема - хотя через несколько лет некоторые могут найти несколько советов:

Не используйте "статически" бесплатно!

Понимать, что означает "статичность" в терминах семантики времени выполнения и времени компиляции (поведения) и синтаксиса.

  • Статический объект будет автоматически создан некоторое время до его первое использование.

  • Статический объект имеет одно место хранения, и это означает, что разделяемые всеми, кто обращается к этому объекту.

  • Статический объект может быть доступен только через его имя типа, а не
    через экземпляр этого типа.

  • Статический метод не имеет неявного 'этого аргумента, как и метод экземпляра. (И поэтому статический метод имеет меньшее выполнение накладные расходы - одна из причин их использования.)

  • Подумайте о безопасности потоков при использовании статических объектов.

Некоторые сведения о статике в MSDN:

Ответ 4

невозможно получить ссылку с экземпляром

Это означает, что вы вызываете метод STATIC и передаете ему экземпляр. Самое простое решение - удалить Static, например:

public static void ExportToExcel (IEnumerable data, string sheetName)       {

Ответ 5

Проверьте, содержит ли ваш код пространство имен, которое соответствует самой правой части вашего статического имени класса.

Учитывая статический класс Bar, определенный в пространстве имен Foo, реализуя метод Jump или свойство, скорее всего, вы получаете компилятор потому что есть еще одно пространство имен, заканчивающееся на Бар. Да, рыбный материал; -)

Если это так, это означает, что вы используете вызов Использовать бар, и Bar.Jump(), поэтому одно из следующих решений должно соответствовать вашим потребностям:

  • Полностью квалифицируйте статическое имя класса с соответствующим пространством имен, результатом чего является объявление Foo.Bar.Jump(). Вам также потребуется удалить инструкцию Использование Bar;
  • Переименовать пространство имен Бар с помощью имени diffente.

В моем случае ошибка компилятора foollowing возникла в проекте репозитория EF (Entity Framework) в вызове Database.SetInitializer()

Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM

Эта ошибка возникает, когда я добавил пространство имен MyProject.ORM.Database, которое sufix (База данных), как вы могли заметить, соответствует Database.SetInitializer имя класса.

В этом, так как я не контролирую статический класс EF База данных, и я также хотел бы сохранить свое собственное пространство имен, я решил полностью квалифицировать статический класс EF Database с его пространством имен Система. Data.Entity, что привело к использованию следующей команды, компиляция которой выполнена успешно:

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)

Надеюсь, что это поможет

Ответ 6

Я получил здесь googling для ошибки компилятора С# CS0176, через (дублированный) вопрос Вопрос о статичном экземпляре экземпляра.

В моем случае ошибка произошла из-за того, что у меня был статический метод и метод расширения с тем же именем. Для этого см. Статический метод и метод расширения с тем же именем.

[Может быть, это должен был быть комментарий. Извините, что пока у меня недостаточно репутации.]

Ответ 7

Я знаю, что это старый поток, но я просто потратил 3 часа, пытаясь понять, в чем моя проблема. Обычно я знаю, что означает эта ошибка, но вы можете столкнуться с этим и более тонким образом. Моя проблема заключалась в том, что мой клиентский класс (тот, который вызвал статический метод из класса экземпляра) имел свойство другого типа, но называемое так же, как и статический метод. Ошибка, сообщаемая компилятором, была такой же, как сообщалось здесь, но проблема была в основном столкновением имен.

Для всех, кто получает эту ошибку, и ни одно из вышеперечисленных действий не помогает, попробуйте полностью определить класс экземпляра с именем пространства имен...(), чтобы компилятор мог видеть точное имя, которое вы имеете в виду.