Cs0120 как исправить

Почему возникает ошибка

LectureForm — это класс формы, таких форм можно создать сколько угодно.

btnNext — это свойство экземпляра класса формы. Это кнопка, которая лежит на конкретном экземпляре формы.

Ошибка говорит о том, что Вы пытаетесь через класс обратиться к свойству объекта этого класса, так делать нельзя.

Общие данные

Т.к. LectureForm показывается отдельно от Param, то обратиться к объекту LectureForm нельзя т.к. форма еще не создана.

В этом случае нужно чтобы Param записала данные куда-нибудь откуда lectureForm может их считать.

Можно например объявить глобальное статическое поле в каком-нибудь классе. Например, в том же Param сделать ему значение по-умолчанию false и изменять его при нажатии на checkbox:

//поле внутри класса `Param`
public static bool LectureFormButtonsVisible = true;

...
//установка в обработчике checkBox
listBox2.Visible = false;

LectureFormButtonsVisible = checkBox1.Checked;

Потом при отображении LectureForm это поле можно будет считать:

private void LectureForm_Load(object sender, EventArgs e)
{
    btnNext.Visible = Param.LectureFormButtonsVisible;
    WMP.Visible = Param.LectureFormButtonsVisible;
}

Как будет время почитайте про проекты проектирования, про то как можно отделить интерфейс от логики. При правильной архитектуре приложения у форм будет доступ к общей модели и они сами будут реагировать на изменение. Построение такой архитектуры сильно зависит от Вашего приложения и, пожалуй, сильно выходит за рамки этого вопроса.

Flooopsik

0 / 0 / 0

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

Сообщений: 4

1

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

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

2628 / 1597 / 851

Регистрация: 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



2727 / 1644 / 869

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

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

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

13756 / 9975 / 2654

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

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

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

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

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

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

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

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

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

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

4

Привет всем.
сегодня хотел сделать нажатие кнопки по нажатию клавиши на клавиатуре, но столкнулся с проблемой которую я не знаю как решать. Надеюсь подскажите как её решить. заранее спасибо
код:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
class MyButtonClass : Form
{

    private Button One, Two, Three, Four, Fife, Six, Seven, Eight, Nine, Zero, Plus, Minus, multiply, division, Equally, dot, Delete, clear, copy, past;
    private TextBox FirstText, SecondText, ThirdText;


    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // MyButtonClass
        // 
        this.ClientSize = new System.Drawing.Size(280, 525);
        this.Name = "MyButtonClass";
        this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
        this.ResumeLayout(false);

    }

    double n, k, res;
    int v, b;

    public MyButtonClass()
    {
        v = 0;
        b = 0;

        Plus = new Button();
        Plus.Text = "+";
        Plus.Top = 150;
        Plus.Left = 210;
        Plus.Height = 100;
        Plus.Width = 70;
        Plus.Click += new System.EventHandler(PlusButton);
        this.Controls.Add(Plus);
        //Declare, properties and call a button

        FirstText = new TextBox();
        FirstText.Text = $"0";
        FirstText.Top = 10;
        FirstText.Left = 0;
        FirstText.Height = 50;
        FirstText.Width = 210;
        this.Controls.Add(FirstText);
        //Declare, properties and call a TextBox

        SecondText = new TextBox();
        SecondText.Text = $"";
        SecondText.Top = 50;
        SecondText.Left = 0;
        SecondText.Height = 50;
        SecondText.Width = 210;
        this.Controls.Add(SecondText);
        //Declare, properties and call a TextBox

        ThirdText = new TextBox();
        ThirdText.Text = $"0";
        ThirdText.Top = 100;
        ThirdText.Left = 0;
        ThirdText.Height = 50;
        ThirdText.Width = 210;
        this.Controls.Add(ThirdText);
        //Declare, properties and call a TextBox

        InitializeComponent();
        this.StartPosition = FormStartPosition.Manual;
        this.Location = new Point(-5, 0);
    }
    [STAThread]
    static void Main()
    {
        Application.Run(new MyButtonClass());
        //starting objects of class MyButtonClass
    }
    void PlusButton(object sender, EventArgs e)
    {

        if (v == 0)
        {
            SecondText.Text = "+";
            v = 1;
        }
        else if (v == 1)
        {

            n = double.Parse(FirstText.Text);
            k = double.Parse(ThirdText.Text);
            if (SecondText.Text == "+")
            {
                res = n + k;
            }
            else if (SecondText.Text == "-")
            {
                res = n - k;
            }
            else if (SecondText.Text == "x")
            {
                res = n * k;
            }
            else if (SecondText.Text == "/")
            {
                res = n / k;
            }
            string r = Convert.ToString(res);
            FirstText.Text = r;
            SecondText.Text = "+";
            ThirdText.Text = "0";
            v = 1;
        }
    }
    public class FilteredTextBox : TextBox
    {
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (e.KeyChar == '+')
            {
                Plus.PerformClick();
                // здесь ошибка
            }
            base.OnKeyPress(e);
        }
    }
}

Содержание

  1. Возникает ошибка компиляции CS0120 при обращении к кнопке на другой форме
  2. 1 ответ 1
  3. Почему возникает ошибка
  4. Общие данные
  5. CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
  6. 7 ответы
  7. C# — Ошибкa CS0120 Для нестатического поля, метода или свойства «Form1.player_name1» требуется ссылка на объект.
  8. CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
  9. 7 ответы
  10. Как вызвать не статическую функцию из статической?
  11. 2 ответа 2

Возникает ошибка компиляции CS0120 при обращении к кнопке на другой форме

У меня есть три формы — главное меню, Param и LectureForm . Главное меню вызывает обе другие формы.

LectureForm — вызывается через кнопку главного меню. Param вызывается через менюстрип главного меню, она является чем-то вроде настроек.

Param настраивает LectureForm . То есть формы открываются по очереди. Сначала я выбираю файл и т.д. А потом захожу в LectureForm

Мне нужно, чтобы при нажатии на CheckBox в Param кнопка в LectureForm исчезала и появлялась.

Возникает ошибка компиляции:

Ошибка CS0120 Для нестатического поля, метода или свойства «LectureForm.btnNext» требуется ссылка на объект

на строке LectureForm.btnNext.Visible = true;

1 ответ 1

Почему возникает ошибка

LectureForm — это класс формы, таких форм можно создать сколько угодно.

btnNext — это свойство экземпляра класса формы. Это кнопка, которая лежит на конкретном экземпляре формы.

Ошибка говорит о том, что Вы пытаетесь через класс обратиться к свойству объекта этого класса, так делать нельзя.

Общие данные

Т.к. LectureForm показывается отдельно от Param , то обратиться к объекту LectureForm нельзя т.к. форма еще не создана.

В этом случае нужно чтобы Param записала данные куда-нибудь откуда lectureForm может их считать.

Можно например объявить глобальное статическое поле в каком-нибудь классе. Например, в том же Param сделать ему значение по-умолчанию false и изменять его при нажатии на checkbox:

Потом при отображении LectureForm это поле можно будет считать:

Как будет время почитайте про проекты проектирования, про то как можно отделить интерфейс от логики. При правильной архитектуре приложения у форм будет доступ к общей модели и они сами будут реагировать на изменение. Построение такой архитектуры сильно зависит от Вашего приложения и, пожалуй, сильно выходит за рамки этого вопроса.

Источник

CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’

Почему возникает эта ошибка?

Ссылка на объект требуется для нестатического поля, метода или свойства WindowsApplication1.Form1.setTextboxText (int)

7 ответы

Похоже, вы вызываете нестатический член (свойство или метод, в частности setTextboxText ) из статического метода (в частности, SumData ). Вам потребуется:

Сделайте также вызываемый член статическим:

Создайте экземпляр Form1 внутри вызывающего метода:

Передача экземпляра Form1 тоже был бы вариант.

Сделайте вызывающий метод нестатическим методом экземпляра (из Form1 ):

Более подробную информацию об этой ошибке можно найти на MSDN.

ответ дан 01 апр.

В этом случае, когда вы хотите получить элемент управления формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.

Зайдите в свой Program.cs и измените

Теперь вы можете получить доступ к элементу управления с помощью

Также: не забудьте установить для Control-Access-Level значение Public.

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

ответ дан 15 окт ’17, 18:10

Вы запускаете поток, который запускает статический метод SumData . Тем не менее, SumData звонки SetTextboxText который не статичен. Таким образом, вам нужен экземпляр вашей формы для вызова SetTextboxText .

Этот ответ, кажется, повторяет проблему. Это не объясняет зачем это вызывает ошибку. — Роберт

Ваш метод должен быть статическим

Создан 01 июля ’14, 14:07

Этот конкретный метод явно обращается к свойствам экземпляра (в частности, this.InvokeRequired и this.Invoke ) и поэтому не может быть статичным. — DBC

Благодарим @COOLGAMETUBE за то, что он подсказал мне, что в итоге сработало для меня. Его идея была хорошей, но у меня возникла проблема, когда Application.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Итак, с небольшими изменениями, это работает для меня:

Создан 27 июля ’18, 03:07

На мой взгляд, вы даете нулевое значение текстовому полю и возвращаете его в ToString() поскольку это статический метод. Вы можете заменить его на Convert.ToString() который может включать нулевое значение.

ответ дан 15 окт ’17, 18:10

На самом деле я получил эту ошибку, потому что проверял InnerHtml на наличие некоторого контента, который был сгенерирован динамически, то есть элемента управления runat = server.

Чтобы решить эту проблему, мне пришлось удалить ключевое слово static в моем методе, и он работал нормально.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# or задайте свой вопрос.

Источник

C# — Ошибкa CS0120 Для нестатического поля, метода или свойства «Form1.player_name1» требуется ссылка на объект.

Ошибка CS0120
Скажите пожалуйста как мне изменить значение в label через функцию в моём классе
Вот полностью код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace game
<
public partial class Form1 : Form
<
public Form1()
<
InitializeComponent();

private void button1_Click(object sender, EventArgs e)
<
player player1 = new player();
player1.name = «Удар пяткой»; player1.link_profile = «»;
player1.strength = 14; player1.age = 18;
player1.info(player1);
>

class player
<
public string name;
public int age, strength;
public float money = 5000;
public string link_profile;

public void info(player playerobj)
<
player_name1.Text(«Имя игрока: <0>«, playerobj.name);
>
>
>

класс player никак не может видеть переменную player_name1, поэтому и ошибка. То есть нужно передать объект класса Label в этот метод.

public void info(player playerobj, Label label)
<
label.Text(«Имя игрока: <0>«, playerobj.name);
>

и в дальнейшем такой подход приведёт к говнокоду. Вашу задачу нужно решать по-другому.

Источник

CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’

Почему возникает эта ошибка?

Ссылка на объект требуется для нестатического поля, метода или свойства WindowsApplication1.Form1.setTextboxText (int)

7 ответы

Похоже, вы вызываете нестатический член (свойство или метод, в частности setTextboxText ) из статического метода (в частности, SumData ). Вам потребуется:

Сделайте также вызываемый член статическим:

Создайте экземпляр Form1 внутри вызывающего метода:

Передача экземпляра Form1 тоже был бы вариант.

Сделайте вызывающий метод нестатическим методом экземпляра (из Form1 ):

Более подробную информацию об этой ошибке можно найти на MSDN.

ответ дан 01 апр.

В этом случае, когда вы хотите получить элемент управления формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.

Зайдите в свой Program.cs и измените

Теперь вы можете получить доступ к элементу управления с помощью

Также: не забудьте установить для Control-Access-Level значение Public.

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

ответ дан 15 окт ’17, 18:10

Вы запускаете поток, который запускает статический метод SumData . Тем не менее, SumData звонки SetTextboxText который не статичен. Таким образом, вам нужен экземпляр вашей формы для вызова SetTextboxText .

Этот ответ, кажется, повторяет проблему. Это не объясняет зачем это вызывает ошибку. — Роберт

Ваш метод должен быть статическим

Создан 01 июля ’14, 14:07

Этот конкретный метод явно обращается к свойствам экземпляра (в частности, this.InvokeRequired и this.Invoke ) и поэтому не может быть статичным. — DBC

Благодарим @COOLGAMETUBE за то, что он подсказал мне, что в итоге сработало для меня. Его идея была хорошей, но у меня возникла проблема, когда Application.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Итак, с небольшими изменениями, это работает для меня:

Создан 27 июля ’18, 03:07

На мой взгляд, вы даете нулевое значение текстовому полю и возвращаете его в ToString() поскольку это статический метод. Вы можете заменить его на Convert.ToString() который может включать нулевое значение.

ответ дан 15 окт ’17, 18:10

На самом деле я получил эту ошибку, потому что проверял InnerHtml на наличие некоторого контента, который был сгенерирован динамически, то есть элемента управления runat = server.

Чтобы решить эту проблему, мне пришлось удалить ключевое слово static в моем методе, и он работал нормально.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# or задайте свой вопрос.

Источник

Как вызвать не статическую функцию из статической?

Как вызвать не статическую функцию из статической? Или получить доступ из статической функции к tw_tree?

Для нестатического поля, метода или свойства «Window1.ReloadT()» требуется ссылка на объект.

При изменении public void ReloadT() на public static void ReloadT() уже нельзя использовать tw_tree:

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

Так нормально происходит вызов статической функции:

2 ответа 2

Можно, например, передать экземпляр Window1 в Window2.

Или создать событие, на которое подписаться в Window1.

Члены класса (поля, свойства, методы) могут быть статическими или экземплярными. К статическим можно обращаться только в контексте класса, к экземплярным — в контексте объекта (нужно создавать объект класса и обращаться через него).

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

Делать члены статическими нужно в том случае, если они являются общими для всех объектов. Например, есть футболисты и мяч. Мы могли бы сделать мяч не статическим, но тогда каждый будет играть своим мячом — командной игры не получится. Мяч должен быть общим (статическим).

В Вашем случае tw_tree относится к объекту. Если Вы сделаете метод ReloadT() статическим, то при обращении к нему не получится использовать tw_tree, т.к. объект, к которому относится tw_tree не был создан.

Источник

Short answer:

Try this:

public static void loadAnotherRemote()
{
    new TypeThatContainsCloseComm(…).closeComm();
}

Longer answer:

First of all, you need to understand static: Whatever is declared static does not belong to any particular instance of a type, but belongs to the type itself. That is, if you have a static method TypeThatContainsCloseComm.closeComm, then you can call it with:

   TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//     name of the type!

However, all methods that are not declared static can only be called on a particular instance, because that’s what they belong to:

   var commProj = new TypeThatContainsClosePort();  // <- create a instance here
   commProj.ClosePort();
// ^^^^^^^^
// instance of a type!

Now, back to your original code:

public void closeComm()
{
    commIRToy.ClosePort();
    commProj.ClosePort();
    commTV.ClosePort();
    commAV.ClosePort();
}

public static void loadAnotherRemote()
{
    // this method is static, therefore we are not "within" an object instance
    closeComm();  // ERROR: closeComm is not static, therefore you need
                  // some object instance to call it!
}

… and back to your second attempt:

public static void closeComm()
{
    commIRToy.ClosePort();  // ERROR if commIRToy, commProj, commTV, commAV
    commProj.ClosePort();   //       are not declared static, because we're
    commTV.ClosePort();     //       in a static method and thus "outside" an
    commAV.ClosePort();     //       object instance, yet these fields are
}                           //       declared within one.

public static void loadAnotherRemote()
{
    closeComm();  // this call is fine now, since `closeComm` is static,
                  // no object instance is required to call it.
}

Short answer:

Try this:

public static void loadAnotherRemote()
{
    new TypeThatContainsCloseComm(…).closeComm();
}

Longer answer:

First of all, you need to understand static: Whatever is declared static does not belong to any particular instance of a type, but belongs to the type itself. That is, if you have a static method TypeThatContainsCloseComm.closeComm, then you can call it with:

   TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//     name of the type!

However, all methods that are not declared static can only be called on a particular instance, because that’s what they belong to:

   var commProj = new TypeThatContainsClosePort();  // <- create a instance here
   commProj.ClosePort();
// ^^^^^^^^
// instance of a type!

Now, back to your original code:

public void closeComm()
{
    commIRToy.ClosePort();
    commProj.ClosePort();
    commTV.ClosePort();
    commAV.ClosePort();
}

public static void loadAnotherRemote()
{
    // this method is static, therefore we are not "within" an object instance
    closeComm();  // ERROR: closeComm is not static, therefore you need
                  // some object instance to call it!
}

… and back to your second attempt:

public static void closeComm()
{
    commIRToy.ClosePort();  // ERROR if commIRToy, commProj, commTV, commAV
    commProj.ClosePort();   //       are not declared static, because we're
    commTV.ClosePort();     //       in a static method and thus "outside" an
    commAV.ClosePort();     //       object instance, yet these fields are
}                           //       declared within one.

public static void loadAnotherRemote()
{
    closeComm();  // this call is fine now, since `closeComm` is static,
                  // no object instance is required to call it.
}

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 in 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

Добавить комментарий