C#编译器错误:“结构中不能有实例字段初始值设定项”

时间:2010-12-10 06:08:28

标签: c#

我需要有关结构的建议。

我有两段代码。第一部分如下:

namespace Project.GlobalVariables
{
    class IOCard
    {
        struct InputCard
        {
            public string CardNo;
            public int BaseAddress;
            public int LowerAddress;
            public int UpperAddress;
            public int[] WriteBitNo = new int[16];
            public int[] ReadBitNo = new int[16];
        }

        static InputCard[] InputCards = new InputCard[5];

        public static string ACardNo = InputCards[1].CardNo;
        public static string BCardNo = InputCards[2].CardNo;

    }
}

第二部分如下:

private void Form1_Load(object sender, EventArgs e)
    {
        IOCard.ACardNo = "Card A";
        IOCard.BCardNo = "Card B";

        MessageBox.Show(IOCard.ACardNo);
        MessageBox.Show(IOCard.BCardNo);
    }

我的计划是能够使用InputCards IOCard分配和检索Form1_Load组件,如using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Project.GlobalVariables { static class IOCard { public const int TotalInputCard = 10; public const int TotalOutputCard = 10; public class InputCard { public string CardNo = "1"; public int BaseAddress; public int LowerAddress; public int UpperAddress; public int[] WriteBitNo = new int[16]; public int[] ReadBitNo = new int[16]; } public class OutputCard { public string CardNo; public int BaseAddress; public int LowerAddress; public int UpperAddress; public int[] WriteBitNo = new int[16]; public int[] ReadBitNo = new int[16]; } public static InputCard[] InputCards = new InputCard[TotalInputCard]; public static OutputCard[] OutputCards = new OutputCard[TotalOutputCard]; public static int X100 = InputCards[0].WriteBitNo[0]; public static int Y100 = OutputCards[0].WriteBitNo[0]; } } 所示。

但是,当我编译代码时,我收到以下错误。

  

错误1'Project.GlobalVariables.IOCard.InputCard.WriteBitNo':结构中不能有实例字段初始值设定项E:\ Programming \ New platform \ StandardPlatform \ StandardPlatform \ Project \ GlobalVariables.cs 16 26 StandardPlatform

有人可以告诉我如何解决错误吗? 请指教。感谢。

以下是我尝试创建和使用的类,但失败了。

Form_Load

我尝试在private void Form1_Load(object sender, EventArgs e) { IOCard.X100 = 1; IOCard.Y100 = 1; } 中使用这些内容,如下所示:

{{1}}

无论我多少尝试在网上搜索答案,我都无处可去。

请指教。感谢。

7 个答案:

答案 0 :(得分:9)

它试图说的是,当你有InputCards = new InputCard[5];时,它将分配一个5倍于InputCard结构大小的内存块,并将其所有字节设置为0.没有机会执行int[] WriteBitNo = new int[16];和此类作业,因此您无法拥有它们。

您可以选择手动调用结构的初始值设定项或将其设为类,并使用InputCards的5个新实例手动初始化InputCard数组。

答案 1 :(得分:4)

您既不能初始化struct的字段,也不能定义默认构造函数来初始化它的字段。查看struct后,我建议您改用class。不建议在有大量字段的情况下使用struct

答案 2 :(得分:4)

在C#中,struct不是对象的引用,其方式与class类型的值相同。 struct的值是struct的实例字段的所有值的“联合”。

现在,struct类型的默认值是所有这些字段默认值的值。从C#开始,语法为:

new S()  // S is a value-type

其中S是结构类型,已等效于该结构的默认值。没有构造函数调用!这是完全相同的值(现在也可以写)

default(S)  // S is a value-type

现在,像

struct S
{
  int field = 42; // non-static field with initializer, disallowed!

  // ...
}

是非法的(不能在结构中使用实例字段初始值设定项)。他们可能会认为field的{​​{1}}为new S(),但事实上42的{​​{1}}必须是field的默认值1}}(为零,与new S()不同)。

通过这个解释,您还可以在C#中看到它为not possible to create a non-static, zero-parameter constructor for a struct type的原因。

答案 3 :(得分:2)

试试这个。使用工厂函数Create()初始化InputCard:

namespace Project.GlobalVariables 
{ 
    class IOCard 
    { 
        struct InputCard 
        { 
            public string CardNo; 
            public int BaseAddress; 
            public int LowerAddress; 
            public int UpperAddress; 
            public int[] WriteBitNo; 
            public int[] ReadBitNo; 

            static InputCard Create()
            {
                return new InputCard()
                {
                    CardNo = string.Empty,
                    WriteBitNo = new int[16],
                    ReadBitNo = new int[16]
                };
            }
        } 

        static InputCard[] InputCards = new InputCard[] 
        {
            InputCard.Create(),
            InputCard.Create(),
            InputCard.Create(),
            InputCard.Create(),
            InputCard.Create()
        };

        public static string ACardNo = InputCards[1].CardNo; 
        public static string BCardNo = InputCards[2].CardNo; 

    } 
}

答案 4 :(得分:0)

使用class而不是结构。结构用于像Point这样的小类型,它们在堆栈和副本上创建得更快,而不是动态创建并通过引用传递。

答案 5 :(得分:0)

不确定异常,但我有一个解决方案。

你不应该为这个类使用“struct”,它太多了(并且存储了太多的数据)。如果将其定义为“类”,则相同的代码可以正常工作。

答案 6 :(得分:0)

您是否希望将其设为struct而不是class

如果你使它成为class,它就可以了。