无法使用对象访问声明的结构

Can't Access Declared Structure with an Object

我正在使用如下所示的结构

public struct TPCANMsg
{
    /// <summary>
    /// 11/29-bit message identifier
    /// </summary>
    public uint ID;
    /// <summary>
    /// Type of the message
    /// </summary>
    [MarshalAs(UnmanagedType.U1)]
    public TPCANMessageType MSGTYPE;  
    /// <summary>
    /// Data Length Code of the message (0..8)
    /// </summary>
    public byte LEN;      
    /// <summary>
    /// Data of the message (DATA[0]..DATA[7])
    /// </summary>
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] DATA;   
}

然后在下面声明结构对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Peak.Can.Basic;

namespace rcToOnBoardPC
{
    class Communication
    {
       // CAN Status Decalaration
       TPCANStatus gStatus;
       // List of CAN Messages
       TPCANMsg msg1 = new TPCANMsg();    
       msg1.ID = 0x100; 

    }
}

我收到以下错误"Error 1 Invalid token '=' in class, struct, or interface member declaration." 不明白为什么我不能访问相应对象的结构。请指导。

由于这个问题涉及一个简单的印刷错误,它可能应该这样关闭,而且最终可能会关闭。

与此同时,评论者想告诉您的是……

基本问题是您在方法之外编写了程序语句。在 C#(实际上,任何类似的语言)中,这是不允许的。程序语句需要包含在方法中(又名 "function")。

您可以通过以下两种方式之一解决问题。最容易理解的是将语句放在方法中(即直接遵守您 运行 反对的语言规则):

class Communication
{
   // CAN Status Decalaration
   TPCANStatus gStatus;
   // List of CAN Messages
   TPCANMsg msg1 = new TPCANMsg();

   public Communication()
   {
       msg1.ID = 0x100; 
   }
}

解决此问题的第二种方法依赖于这样一个事实,即程序 statements 不能存在于方法之外,但您可以使用 expressions 在各种上下文中,包括初始值设定项。 C# 有一个初始化语法,允许您将赋值语句作为初始化的一部分。 IE。从技术上讲,您只是在编写一个初始化表达式,但在这种情况下,您可以编写一小段代码,只要它包含的程序语句的唯一类型是赋值,即使它在方法之外也是合法的

该方法如下所示:

class Communication
{
   // CAN Status Decalaration
   TPCANStatus gStatus;
   // List of CAN Messages
   TPCANMsg msg1 = new TPCANMsg { ID = 0x100 };
}

请注意,在使用该语法时,您还可以在调用无参数构造函数时省略括号 ()。这不是必需的;如果您更喜欢写 new TPCANMsg() { ID = 0x100 },那也是允许的。