C#编译器错误:“结构中不能有实例字段初始化程序”

我需要有关结构的建议。

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

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); } 

我的计划是能够使用IOCard分配和检索InputCards组件,如Form1_Load所示。

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

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

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

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

 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]; } } 

我尝试在Form_Load使用这些,如下所示:

 private void Form1_Load(object sender, EventArgs e) { IOCard.X100 = 1; IOCard.Y100 = 1; } 

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

请指教。 谢谢。

它试图说的是当你有InputCards = new InputCard[5]; 它将分配一个内存块,其大小是InputCard结构的5倍,并将其所有字节设置为0.没有机会执行int[] WriteBitNo = new int[16]; 和这样的任务,所以你不能拥有它们。

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

您既不能初始化struct的字段,也不能定义默认构造函数来初始化它的字段。 看完你的struct ,我建议你改用一个class 。 不建议在具有大量字段的场景中使用struct

试试这个。 使用工厂函数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; } } 

在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! // ... } 

是非法的( 不能在结构中有实例字段初始值设定项 )。 它们可以给人一种new S()field42的印象,但实际上new S()field必须是int的默认值(它是零,与42不同)。

通过这个解释,您还可以看到为什么不能在C#中为结构类型创建非静态的零参数构造函数 。

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

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

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

是否有一个特殊的原因,你希望这是一个struct而不是一个class

如果你把它变成一个class ,它就可以了。