C#Structs:未分配的局部变量?

从文档 :

与类不同,可以在不使用新运算符的情况下实例化结构。

那我为什么会收到这个错误:

使用未分配的局部变量’x’

当我尝试这样做?

Vec2 x; xX = det * (a22 * bX - a12 * bY); xY = det * (a11 * bY - a21 * bX); 

Vec2 x是一个结构?

嗯,X和Y属性(而不是字段)? 如果是这样,那就是问题所在。 在x中的所有字段都明确赋值之前,您无法调用任何方法或属性。

例如:

 public struct Foo { public int x; public int X { get { return x; } set { x = value; } } } class Program { static void Main(string[] args) { Foo a; ax = 10; // Valid Foo b; bX = 10; // Invalid } } 

Vec2是你自己的类型吗? 您是否可以访问所涉及的字段,或仅访问属性?

如果它是你自己的类型,我强烈建议你尝试坚持不可变的结构。 我知道托管DirectX有一些可变的结构,可以尽可能接近最佳性能,但这是以这种奇怪的情况为代价的 – 更糟糕的是,说实话。

我个人会给结构一个带X和Y的构造函数:

  Vec2 x = new Vec2(det * (a22 * bX - a12 * bY), det * (a11 * bY - a21 * bX)); 

它还没有初始化。 您需要在使用之前对其进行初始化。 如果您不想创建静态Vec.Empty值并且满足结构成员的默认值,则可以使用default运算符:

 Vec2 x = default(Vec2); 

米奇小麦:

但是,这不是:

 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; xX = 1; xY = 2; } 

编译器阻止您在类型的所有成员初始化之前调用属性,即使属性可能只设置其中一个值。 Jon Skeet提出的解决方案是使用初始化构造函数,最好不要使用setter。