我目前有一个Match结构,其中包含一个Blocks列表。
public struct Match{
public List<Block> blocks;
}
当我尝试创建一个新的Match(在本例中,称为matchData)并将Blocks添加到其Block列表时,我的编译器输出:
Use of unassigned local variable 'matchData'
我尝试通过这样做来初始化列表:
public struct Match{
public List<Block> blocks = new List<Block>();
}
会导致以下错误:
Structs cannot have instance field initializers
那么我应该如何初始化我的Match结构?我必须做一个构造函数吗?
答案 0 :(得分:5)
来自MSDN:
初始化结构体中的实例字段也是错误的。 您只能使用参数化来初始化struct成员 构造函数或通过在结构之后单独访问成员 被宣布。任何私人或其他无法访问的成员都可以 仅在构造函数中初始化。
http://msdn.microsoft.com/en-us/library/0taef578.aspx
因此,您可以在参数化构造函数中初始化列表,如下所示:
public struct Match{
public List<Block> blocks;
public Match(List<Block> blocks)
{
this.blocks = blocks;
}
}
或者从外面设置:
Match m = new Match();
m.blocks = new List<Block>();
作为旁注,你可能最好在这里使用类而不是结构。您使用dosent似乎符合典型用例,如下所示:http://msdn.microsoft.com/en-us/library/ah19swz4.aspx
答案 1 :(得分:4)
您收到了“使用未分配的本地变量'matchData'”,因为您没有致电new Match()
:
Match matchData;
matchData.blocks = new List<Block>(); // error!
可是:
Match matchData = new Match();
matchData.blocks = new List<Block>(); // fine!
Structs有一个隐式无参数构造函数,它将所有字段初始化为默认值。
但是:您应该使用class
而不是struct
,除非您完全了解结构在C#中的工作原理。不要只使用struct,因为它比一个类“更轻”。
特别是,您的Block
结构是可变的,which makes for a bad time。