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

时间:2010-01-15 04:02:43

标签: c# struct

来自documentation

  

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

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

  

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

当我尝试这样做时?

        Vec2 x;
        x.X = det * (a22 * b.X - a12 * b.Y);
        x.Y = det * (a11 * b.Y - a21 * b.X);

Vec2 x是哪个结构?

2 个答案:

答案 0 :(得分:23)

嗯,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;
        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));

答案 1 :(得分:9)

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

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。