C#Struct私有/公共错误

时间:2011-08-16 22:49:18

标签: c# struct

我的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 个答案:

答案 0 :(得分:2)

正如编译器告诉您的那样,您正在尝试执行需要静态变量的操作。您要么想要创建frameLimits的实例,要么更有可能将yval声明为static

答案 1 :(得分:1)

frameLimitsMax类型而不是struct 实例 - 您只能设置实例的实例属性。除此之外,你真的不应该使用可变的,嵌套的结构 - 请重新考虑。

答案 2 :(得分:1)

问题:

(其次是黑客解决方案,然后是简化解决方案

目前,您声明了两种数据类型,一种是嵌套的,因此您可以使用每种数据类型声明变量:

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

智能感知显示:highest. enter image description here

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

智能感知显示: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;
        }
    }
}

答案 3 :(得分:0)

frameLimits是一个struct(思考类型),因此您需要先创建一个实例才能进行赋值,或者使该字段的路径只包含静态成员。