Ошибка 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.

Хочу создать статическую переменную ,которая возвращает количество строк в таблице.

Ошибка: CS0120 Для нестатического поля, метода или свойства "Person.dataGridView1" требуется ссылка на объект.

Как исправить ошибку?

public static int person_count
{
    get =>dataGridView1.RowCount;
    set
    {
    }
}

aepot's user avatar

aepot

45.4k5 золотых знаков22 серебряных знака51 бронзовый знак

задан 21 мая 2021 в 11:51

Артур Шаймарданов's user avatar

3

Это происходит из-за того, что переменная person_count статическая, а dataGridView1 не статический, одним из возможных способов решения является — сделать переменную не статической, то есть

было:public static int person_count.

стало:public int person_count.

Либо же делать dataGridView1 статическим, если переменная необходима статической.

ответ дан 21 мая 2021 в 12:30

xantin's user avatar

xantinxantin

19511 бронзовых знаков

class Form1 : Form //основная форма
{
   //dataGridView1 в дизайнере
   button_click_createform(sender, arg)
   {
      Form2 f2 = new Form2(dataGridView1);
   }
}

class Form2 : Form //второстепенная форма
{
   DataGridView ref_dataGridView;
   int person_count => ref_dataGridView.RowCount; //вот тут нужные вам данные
   public Form2(DataGridView dataGridView)
   {
      ref_dataGridView = dataGridView;
   }
}

ответ дан 22 мая 2021 в 18:04

Blackmeser's user avatar

BlackmeserBlackmeser

2,0331 золотой знак9 серебряных знаков12 бронзовых знаков

person_count сделайте не статическим:

public int person_count
{
    get =>dataGridView1.RowCount;
    set
    {
    }
}

0xdb's user avatar

0xdb

51.5k195 золотых знаков56 серебряных знаков233 бронзовых знака

ответ дан 28 июн 2021 в 13:12

Mher Balayan's user avatar

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Compiler Error CS0120

Compiler Error CS0120

07/20/2015

CS0120

CS0120

3ff67f11-bdf9-436b-bc0c-4fa3cd1925a6

Compiler Error CS0120

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

In order to use a non-static field, method, or property, you must first create an object instance. For more information about static methods, see Static Classes and Static Class Members. For more information about creating instances of classes, see Instance Constructors.

Example 1

The following sample generates CS0120:

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void f() {}
    // Non-static property.
    int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        i = 10;   // CS0120
        f();   // CS0120
        int p = Prop;   // CS0120
    }
}

To correct this error, first create an instance of the class:

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void f() { }
    // Non-static property.
    int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        var mc = new MyClass();
        mc.i = 10;
        mc.f();
        int p = mc.Prop;
    }
}

Example 2

CS0120 will also be generated if there is a call to a non-static method from a static method, as follows:

// CS0120_2.cs
// CS0120 expected
using System;

public class MyClass
{
    public static void Main()  
    {  
        TestCall();   // CS0120
   }

   public void TestCall()
   {
   }
}

To correct this error, first create an instance of the class:

// CS0120_2.cs
using System;

public class MyClass
{
    public static void Main()
    {
        var anInstanceofMyClass = new MyClass();
        anInstanceofMyClass.TestCall();
    }

    public void TestCall()
    {
    }
}

Example 3

Similarly, a static method cannot call an instance method unless you explicitly give it an instance of the class, as follows:

// CS0120_3.cs
using System;

public class MyClass
{
   public static void Main()
   {
      DoIt("Hello There");   // CS0120
   }
  
   private void DoIt(string sText)
   {
      Console.WriteLine(sText);
   }
}

To correct this error, you could also add the keyword static to the method definition:

// CS0120_3.cs
using System;

public class MyClass
{
   public static void Main()
   {
      DoIt("Hello There");   // CS0120
   }
  
   private static void DoIt(string sText)
   {
      Console.WriteLine(sText);
   }
}

See also

  • The C# type system

Flooopsik

0 / 0 / 0

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

Сообщений: 4

1

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

11.01.2020, 21:52. Показов 13836. Ответов 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 / 870

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

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

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

13821 / 10026 / 2670

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

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

Записей в блоге: 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

  • 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

Понравилась статья? Поделить с друзьями:
  • Ошибка cs0106 модификатор public недопустим для этого элемента
  • Ошибка cs0106 модификатор private недопустим для этого элемента
  • Ошибка cs0103 имя initializecomponent не существует в текущем контексте
  • Ошибка cs0101 пространство имен уже содержит определение для
  • Ошибка cs0004 pubg на ps4