无法使用对象访问声明的结构
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 }
,那也是允许的。
我正在使用如下所示的结构
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 }
,那也是允许的。