C # Структура частной / публичной ошибки - PullRequest
1 голос
/ 17 августа 2011

У меня проблемы с моим Struct :), компилятор выдает ошибку

"Ссылка на объект требуется для нестатического поля, метода или свойство 'SonyasProgram.Form1.frameLimits.Max.Y.get' "

Я пытался найти решение, но ни одно из них не было особенно ясным. Вот мой код:

    public partial class Form1 : Form
{
    public struct frameLimits
    {
        public struct Max
        {
            private int yval = 220;
            public int Y
            {
                get
                {
                    return yval;
                }
                set
                {
                    yval = value;
                }
            }
        }
    }

    public Form1()
    {
        frameLimits.Max.Y = 1;

В последней строке указывается ошибка. Любая помощь будет потрясающей, спасибо!

Ответы [ 4 ]

2 голосов
/ 17 августа 2011

Как говорит вам компилятор, вы пытаетесь выполнить операцию, для которой требуется статическая переменная.Вы либо хотите создать экземпляр frameLimits, либо, более вероятно, объявите yval как static.

1 голос
/ 17 августа 2011

Проблема:

(затем Взломанное решение , затем Упрощенное решение )

В настоящее время объявлено два типа данных, и один из них являетсявложенные, поэтому вы можете объявлять переменные, используя каждый из типов данных следующим образом:

frameLimits.Max highest = new frameLimits.Max();
highest.Y = 5;

IntelliSense показывает: highest.enter image description here

frameLimits limits = new frameLimits();
// no members exist on the frameLimits type, so nothing to access. 

IntelliSense показывает: limits.enter image description here

IntelliSense может помочь разобраться.

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

Взломанное решение

Если я добавлю поле экземпляра MaxValue в вашу структуру Max, то я могу приблизиться к тому, что вы хотели.Это позволит коду вызывающего абонента быть:

            frameLimits limits = new frameLimits();
            limits.MaxValue.Y = 5;

Однако это действительно сложный способ сделать это и не рекомендуется.

Модифицированная структура выглядит следующим образом:

public struct frameLimits
{
    public struct Max
    {
        private int yval;
        public int Y
        {
            get
            {
                return yval;
            }
            set
            {
                yval = value;
            }
        }
    }

    public Max MaxValue;
}

Упрощенное решение

Вы можете удалить внутреннюю структуру просто, но вы по-прежнему имеете некоторые ограничения со структуройи именно поэтому я реализую значение по умолчанию 220, как и я.

Новый код вызывающего абонента:

            FrameLimits limits = new FrameLimits();
            Console.Write( limits.MaxY );  // prints 220
            limits.MaxY = 5;

Эта структура в некоторой степени упрощена (удаленная вложенная структура):

public struct FrameLimits
{
    private int? yval;

    public int MaxY
    {
        get
        {
            return yval.HasValue ? yval.Value : 220;
        }
        set
        {
            yval = value;
        }
    }
}
1 голос
/ 17 августа 2011

frameLimits и Max - это типы , а не struct экземпляры - вы можете установить только свойства экземпляра экземпляра. Кроме того, вам не следует использовать изменяемые вложенные структуры - пожалуйста, пересмотрите.

0 голосов
/ 17 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...