为什么我会在创建和返回新结构时遇到此错误?

编译此代码时出错:

using System; public struct Vector2 { public event EventHandler trigger; public float X; public float Y; public Vector2 func() { Vector2 vector; vector.X = 1; vector.Y = 2; return vector; // error CS0165: Use of unassigned local variable 'vector' } } 

您好!

编译器说:“使用未分配的局部变量’vector’”并指向返回值。 在我看来,Vector2成为一个引用类型(没有事件成员它正常行事)。 怎么了?

在C#中,除非要初始化所有字段,否则仍需要“new”一个结构来调用构造函数。 你没有分配EventHandler成员’trigger’。

尝试分配“触发器”或使用:

 Vector2 vector = new Vector2() 

新对象在堆上分配,它仍在function堆栈上分配。

引用MSDN :

使用new运算符创建结构对象时,会创建它并调用相应的构造函数。 与类不同,可以在不使用new运算符的情况下实例化结构。 如果不使用new,则字段将保持未分配状态,并且初始化所有字段之前无法使用 对象

其他人已经解释了解决这个问题的方法,但我认为值得一提的是代码中存在的另一个重大问题:你有一个可变的结构。 这些都是一个坏主意。 如果你保持这种状态,这肯定只是你遇到的许多问题中的第一个问题。

强烈建议您使其成为不可变或使其成为一个类。

Rob Walker有更好的回应,因为他从文档开始然后推理到代码(而我反过来说)。

如果您使用已注释掉的触发器字段编译示例代码,然后运行IlAsm以获取生成的MSIL,您将看到本地变量向量没有initobj操作码。

Vector2结构只包含值类型时,缺少initobj就可以了。 毕竟他们只是原始记忆。 但是,如果Vector2结构也包含引用,则必须初始化它以防止具有未初始化的对象引用。

为了避免返回部分单元化对象,您需要显式写入trigger事件处理程序,或者通过新操作初始化整个对象。 但是,在任何情况下结构都不会变成参考类型。