Ошибка cs0120 для нестатического поля метода или свойства требуется ссылка на объект

For this case, where you want to get a Control of a Form and are receiving this error, then I have a little bypass for you.

Go to your Program.cs and change

Application.Run(new Form1());

to

public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);

Now you can access a control with

Program.form1.<Your control>

Also: Don’t forget to set your Control-Access-Level to Public.

And yes I know, this answer does not fit to the question caller, but it fits to googlers who have this specific issue with controls.

Привет Всем! Что означает

Для нестатического поля, метода или свойства «WindowsApplication1.Form1.textBox1» требуется ссылка на объект C:UsersВладикAppDataLocalTemporary ProjectsWindowsFormsApplication1Form1.cs 71 13 WindowsFormsApplication1

Код

Form2 f2 = new Form2();
                f2.Show();
                Form1.textBox1.Text = "text";

Ошибка в чём?

angry's user avatar

angry

8,64717 золотых знаков73 серебряных знака180 бронзовых знаков

задан 26 июн 2012 в 16:36

RconPro's user avatar

2

Есть несколько вариантов, самый простой, это сменить модификатор доступа textBox что не есть хорошо, т.е. с privat на public

public System.Windows.Forms.TextBox textBox1;

Лично я использую интерфейс, в котором реализую нужные мне свойства, события, etc…
Привязываю к классу, и

Form2 form = new Form2(this);

Думаю в интернете много инфы на эту тему, погуглите.

ответ дан 26 июн 2012 в 17:42

johniek_comp's user avatar

johniek_compjohniek_comp

2,5094 золотых знака25 серебряных знаков45 бронзовых знаков

4

Вы вообще понимаете что делаете? Form1 это класс, у вас должна быть ссылка на экземпляр первой формы. То есть можно его передавать как делегат (не путать с шарповскими делегатами), например в конструкторе

private Form1 delForm1;
public void Form2(Form1 delForm1) {
this.delForm1 = delForm1;
}

public void Foo() {
delForm1.ChangeText(this.textBox1.text);
}

А в классе Form1

public void ChangeText(string text) {
textBox1.text = text;
}

ответ дан 26 июн 2012 в 17:52

misha_m's user avatar

misha_mmisha_m

1,4059 серебряных знаков12 бронзовых знаков

2

Flooopsik

0 / 0 / 0

Регистрация: 11.01.2020

Сообщений: 4

1

Для нестатического поля, метода или свойства требуется ссылка на объект

11.01.2020, 21:52. Показов 13952. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, не могу решить проблемы в программе.
Почти дописал парсер математических выражений на С# через построение AST.
Визуалка выдает 2 ошибка, как их решить не знаю.
Зараннее спасибо за объяснения.

Список ошибок:

Ошибка CS0120 Для нестатического поля, метода или свойства «MathLangParser.Parse(string)» требуется ссылка на объект.
Ошибка CS0120 Для нестатического поля, метода или свойства «MathLangIntepreter.Execute(AstNode)» требуется ссылка на объект.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.IO;
 
namespace CourseWork
{
    class Program
    {
        static void Main(string[] args)
        {
                // в зависимости от наличия параметров командной строки
                // разбираем либо файл с именем, переданным первым параметром
                // командной строки, либо стандартный ввод
                TextReader reader =
                args.Length >= 1 ? new StreamReader(args[0])
                : Console.In;
                String source = reader.ReadToEnd();
                try
                {
                    AstNode program = MathLangParser.Parse(source);//ошибка здесь
                    AstNodePrinter.Print(program);
                    Console.WriteLine("------------------------");
                    MathLangIntepreter.Execute(program);//ошибка здесь
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: {0}", e);
                }
                Console.ReadLine();         
        }
    }
}

C#
1
2
3
4
5
    public AstNode Parse(string source)
        {
            MathLangParser mlp = new MathLangParser(source);
            return mlp.Parse(source);
        }
C#
1
2
3
4
5
 public void Execute(AstNode programNode)
        {
            MathLangIntepreter mei = new MathLangIntepreter(programNode);
            mei.Execute(programNode);
        }



0



samana

2629 / 1597 / 852

Регистрация: 23.02.2019

Сообщений: 3,876

11.01.2020, 22:21

2

Лучший ответ Сообщение было отмечено Flooopsik как решение

Решение

Вы пытаетесь вызвать обычные методы в статическом методе, так не работает.
Либо сделайте ваши методы статичными:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
namespace CourseWork
{
    class Program
    {
        static void Main(string[] args)
        {
            // какой-то код..
 
            AstNode program = MathLangParser.Parse(source); // вызов статического метода
 
            MathLangIntepreter.Execute(program); // вызов статического метода
 
            // какой-то код..
        }
    }
 
    internal class MathLangIntepreter
    {
        internal static void Execute(AstNode program) // статический метод
        {
            // реализация
        }
    }
 
    public class MathLangParser
    {
        internal static AstNode Parse(object source) // статический метод
        {
            // реализация
        }
    }
 
}

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
namespace CourseWork
{
    class Program
    {
        static void Main(string[] args)
        {
            // какой-то код..
 
            MathLangParser parser  = new MathLangParser();
            AstNode program = parser.Parse(source); // вызов метода экземпляра класса
 
            MathLangIntepreter math = new MathLangIntepreter();
            math.Execute(program); // вызов метода экземпляра класса
 
            // какой-то код..
        }
    }
 
    internal class MathLangIntepreter
    {
        internal void Execute(AstNode program) // обычный метод
        {
            // реализация
        }
    }
 
    public class MathLangParser
    {
        internal AstNode Parse(object source) // обычный метод
        {
            // реализация
        }
    }
 
}

В вашем случае, конечно правильнее сделать методы статичными, как в первом коде.



1



2728 / 1644 / 871

Регистрация: 14.04.2015

Сообщений: 5,616

11.01.2020, 22:23

3

Flooopsik, во-первых, ошибка говорит о том, что нет ссылки на определенную сборку. а взять ее можно из GitHub https://github.com/ArtObr/PascalCompilator
добавить проект в свой Solution, и протянуть ссылку в своей проект.
дальше, скачать пакет Antlr из NuGet и подключить
using Antlr.Runtime.Tree;
using AstNode = Antlr.Runtime.Tree.ITree;

но это тоже не решит проблемы, так как исходный метод Execute в классе MathLangIntepreter не имеет параметров, а ты в него пытаешься что-то передать. что касается Parse в MathLangParser, то его беглым взглядом вообще найти не удалось, откуда ты его откопал, не известно.



1



Модератор

Эксперт .NET

14723 / 10062 / 2676

Регистрация: 21.04.2018

Сообщений: 29,918

Записей в блоге: 2

12.01.2020, 02:24

4

Flooopsik, вы приводите текст ошибок, НО не приводите файлы и номера строк где они возникли.

Вы привели коды двух методов AstNode Parse(string source) и void Execute(AstNode programNode), НО в коде Main не видно где вы к ним обращаетесь.
Эти метода объявлены в каком типе?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

12.01.2020, 02:24

Помогаю со студенческими работами здесь

Для нестатического поля, метода или свойства требуется ссылка на объект
Имеется 2 формы, необходимо, чтобы при нажатии на кнопку на Форме№2 совершилось действие на Форме№1…

Для нестатического поля, метода или свойства требуется ссылка на объект
Выдает ошибку &quot;&quot;Ошибка 1 Для нестатического поля, метода или свойства…

Для нестатического поля, метода или свойства требуется ссылка на объект
Замучился уже. Кто может помочь? Есть 2 datagrid заполняемых динамически (по регистрации карточек в…

Для нестатического поля, метода или свойства требуется ссылка на объект
Для нестатического поля, метода или свойства требуется ссылка на объект
static void Main(string…

Для нестатического поля, метода или свойства требуется ссылка на объект
Мне нужно передать массив в функцию, при передаче возникает ошибка( в мейне), в это же время при…

Ошибка “Для нестатического поля, метода или свойства требуется ссылка на объект”
static void Main()
{
using (Imap imap = new Imap())
{

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

4

In this tutorial, you’ll learn everything about the error “CS0120 – An object reference is required for the nonstatic field, method, or property ‘member’ in C#, why this error appears in your .NET Code and how you can fix them by following simple steps.

C# Compiler Error

This is how the CS0120 error in C# looks like in general.

CS0120 – An object reference is required for the nonstatic field, method, or property ‘member’

Reason for the Error

You will receive the CS0120 error in C# when you are trying to access an non-static field, property or method from a static class.

For example, the below code snippet contains a non-static property MyProperty defined in the class by name “DeveloperPublish” and you are trying to access this non-static property from a static method (“Main”) defined in the same class.

namespace DeveloperPublishNamespace
{

    public class DeveloperPublish
    {
        public int MyProperty { get; set; }
        public static void Main()
        {
            MyProperty = 1;
        }
    }
}

This will result with the compiler error CS0120.

Error CS0120 An object reference is required for the non-static field, method, or property ‘DeveloperPublish.MyProperty’ ConsoleApp1 C:UsersSenthilsourcereposConsoleApp1ConsoleApp1Program.cs 9 Active

C# Error CS0120 – An object reference is required for the nonstatic field, method, or property 'member'

Solution

To fix the CS0120 Error in C#, avoid accessing the non-static member directly from the static method.

  • Remove From My Forums
  • Вопрос

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    public class A //Класс A
    {
        public float a; // Поле а класса А
        public float b; // Поле b класса A
        public A() { a = 3f; b = 2.5f; } // Конструктор без параметров

        public float c   //Свойство с
        {
            get { return a / b; }  //Метод
            set { c = value; } //Возвращаемое значение

        }
    }
    public class B : A //Класс В — наследник класса А
    {
        public float d = 10f; // Поле d класса В
        public int i;
        public float c2 // Свойство с2
        {
            get { return a + b + d; }
            set { c2 = value; }
        }
        static void Main(string[] args) //Начало программы

        {
            Console.WriteLine(«Введите число и увидите значения «);
            Console.WriteLine(«1 — полей a,b,d»);
            Console.WriteLine(«2 — свойств с,c2»);
            B.i = Console.ReadLine();
            switch (B.i) //Проверяем чему равно i  
            {
                case 1: Console.WriteLine(«a={0} «, B.a, «b={0} «, B.b, «d={0} «, B.d); break;
                case 2: Console.WriteLine(«2={0} «, B.c, «c2={0} «, B.c2); break;
                default:
                    Console.WriteLine(«Введено неправильное значение «); break;

                    
            }
        }
    }

Ответы

  • Добрый день.

    В языке C# разделяют динамические и статические члены класса. То что объявляете вы, например:

    public class A //Класс A 
    {
        public float a; // Поле а класса А 
    }

    Это объявление динамического поля. Доступ к нему вне класса может идти только через объектную переменную. Как-нибудь так:

    A myObject = new A();
    myObject.a = 10;

    Чтобы обращаться по имени класса, необходимо член объявить как статический, например, вот так:

    public class A //Класс A 
    {
        public static float a; // Поле а класса А 
    }

    К такому полю можно будет обращаться через имя класса:

    A.a = 10;

    • Изменено

      2 декабря 2016 г. 11:05

    • Помечено в качестве ответа
      Maksim MarinovMicrosoft contingent staff, Moderator
      5 декабря 2016 г. 8:27

Возможно, вам также будет интересно:

  • Ошибка cs0115 form1 dispose bool не найден метод пригодный для переопределения
  • Ошибка cs0106 модификатор public недопустим для этого элемента
  • Ошибка cs0103 visual studio
  • Ошибка cs0021 не удается применить индексирование через к выражению типа int
  • Ошибка cs0006 не удалось найти файл метаданных dll

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии