根据文档:
与类不同,结构体可以在不使用 new 操作符的情况下进行实例化。
那我为什么会收到这个错误:
使用了未赋值的局部变量“x”
当我尝试做这个时?
Vec2 x;
x.X = det * (a22 * b.X - a12 * b.Y);
x.Y = det * (a11 * b.Y - a21 * b.X);
当Vec2 x
是一个结构时?
好的,那么X和Y是属性(而不是字段)吗?如果是这样,那就是问题所在。在确定赋值之前,您不能调用任何方法或属性。
例如:
public struct Foo
{
public int x;
public int X { get { return x; } set { x = value; } }
}
class Program
{
static void Main(string[] args)
{
Foo a;
a.x = 10; // Valid
Foo b;
b.X = 10; // Invalid
}
}
你的Vec2
是自己的类型吗?你能够访问所涉及的字段,还是只能访问属性?
如果这是你自己的类型,我强烈建议你尝试使用不可变的结构体。我知道受控的DirectX有一些可变的结构体,以尽可能接近最佳性能为目标,但这是以牺牲诸如此类奇怪情况等更糟糕的后果为代价的。
我个人会给结构体一个带有X和Y的构造函数:
Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
det * (a11 * b.Y - a21 * b.X));
它仍未初始化。在使用前你需要对其进行初始化。如果你不想创建一个静态的Vec.Empty
值并且满足结构体成员的默认值,可以使用default
运算符来完成初始化:
Vec2 x = default(Vec2);
Mitch Wheat:
这个很明显,但是以下的内容可能不是:
public struct Vec2
{
int x;
int y;
public float X { get { return x; } set { x = value; } }
public float Y { get { return y; } set { y = value; } }
}
static void Main(string[] args)
{
Vec2 x;
x.X = 1;
x.Y = 2;
}
即使属性只设置一个值,编译器也会防止您在类型的所有成员被初始化之前调用属性。解决方案是像Jon Skeet所建议的那样拥有一个初始化构造函数,最好不要有setter。