Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“编译器错误:”;结构中不能有实例字段初始值设定项;_C# - Fatal编程技术网

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

C# C“编译器错误:”;结构中不能有实例字段初始值设定项;,c#,C#,我需要结构方面的建议 我有两段代码。第一节内容如下: namespace Project.GlobalVariables { class IOCard { struct InputCard { public string CardNo; public int BaseAddress; public int LowerAddress; public int

我需要结构方面的建议

我有两段代码。第一节内容如下:

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);
    }
第二部分如下:

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\u 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];
    }
}
我尝试在
加载表单中使用这些,如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    IOCard.X100 = 1;
    IOCard.Y100 = 1;
} 
无论我多么努力地在网上寻找答案,我都一无所获


请告知。谢谢。

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

不确定是否存在异常,但我有一个解决方案


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

您既不能初始化结构的字段,也不能定义默认构造函数来初始化其字段。在查看了
结构之后,我建议您改用
。对于有大量字段的场景,不建议使用
struct

是否有特殊原因使其成为
struct
而不是


如果你把它变成一个
,它就工作得很好。

它想说的是,当你有
输入卡=新的输入卡[5]它将分配一块内存,其大小为
输入卡结构的5倍,并将其所有字节设置为0。没有机会执行
int[]WriteBitNo=new int[16]和此类分配,因此您不能拥有它们


您可以选择手动调用结构的初始值设定项,或者将其设为类,并使用5个新的
InputCard实例手动初始化
InputCards
数组。使用工厂函数
Create()
初始化输入卡:

在C#中,
struct
值是而不是
类型的值那样对对象的引用。
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!

  // ...
}
是非法的(结构中不能有实例字段初始值设定项)。它们可能给人的印象是
新S()
字段将是
42
,但实际上
新S()
字段必须是
int
的默认值(即零,与
42
不同)


有了这个解释,你也明白了为什么,在C#中。

对此感到抱歉。无法理解“动态创建”是什么意思?当向函数传递结构变量或从函数返回结构变量时,会复制整个变量(“动态创建”)。传递类变量时,只发送对该实例的引用。如果数据小于16字节,那么复制整个实例实际上比传递引用要快。当一个结构变得更大时,它会变得更慢,因为每当它被传递到任何地方时都必须复制更多的数据。关于何时使用
struct
:不正确。Microsoft在这里有一篇C#编程指南文章,介绍了如何“初始化结构的字段”和“如何定义构造函数来初始化其字段”:您所说的“不可能”实际上既受支持又简单。感谢您的建议。我怎样才能在课堂上做到这一点?有样本代码吗?谢谢