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

JoJ*_*oJo 15 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;

    }
}
Run Code Online (Sandbox Code Playgroud)

第二部分如下:

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

        MessageBox.Show(IOCard.ACardNo);
        MessageBox.Show(IOCard.BCardNo);
    }
Run Code Online (Sandbox Code Playgroud)

我的计划是能够InputCards使用IOCard如下所示分配和检索组件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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

private void Form1_Load(object sender, EventArgs e)
{
    IOCard.X100 = 1;
    IOCard.Y100 = 1;
} 
Run Code Online (Sandbox Code Playgroud)

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

请指教.谢谢.

Gab*_*abe 9

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

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


dec*_*one 6

您既不能初始化 astruct的字段,也不能定义默认构造函数来初始化它的字段。在查看您的 之后struct,我建议您改用 a class。不建议将 astruct用于您有一堆字段的场景。


Jep*_*sen 6

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

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

new S()  // S is a value-type
Run Code Online (Sandbox Code Playgroud)

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

default(S)  // S is a value-type
Run Code Online (Sandbox Code Playgroud)

现在,诸如

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

是非法的(在结构中不能有实例字段初始化器)。他们可能给人的印象是,field一个new S()42,但实际上fieldnew S()必须是默认值int(它是一个零,从不同的42)。

通过此说明,您还将看到为什么无法在C#中为结构类型创建非静态的,零参数的构造函数


Ale*_*x F 0

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