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()
的field
为42
的印象,但实际上new S()
的field
必须是int
的默认值(它是零,与42
不同)。
通过这个解释,您还可以看到为什么不能在C#中为结构类型创建非静态的零参数构造函数 。
使用类而不是结构。 结构用于像Point这样的小类型,它们在堆栈和复制上创建得更快,而不是动态创建并通过引用传递。
不确定exception,但我有一个解决方案。
你不应该为这个类使用“struct”,它太多了(并且存储了太多的数据)。 如果将其定义为“类”,则相同的代码可以正常工作。
是否有一个特殊的原因,你希望这是一个struct
而不是一个class
?
如果你把它变成一个class
,它就可以了。