从文档:
与类不同,可以在不使用新运算符的情况下实例化结构.
那我为什么会收到这个错误:
使用未分配的局部变量'x'
当我尝试这样做?
Vec2 x;
x.X = det * (a22 * b.X - a12 * b.Y);
x.Y = det * (a11 * b.Y - a21 * b.X);
Run Code Online (Sandbox Code Playgroud)
Vec2 x结构在哪里?
Jon*_*eet 24
那么,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
}
}
Run Code Online (Sandbox Code Playgroud)
是Vec2你自己的类型?您是否可以访问所涉及的字段,或仅访问属性?
如果它是你自己的类型,我强烈建议你尝试坚持不可变的结构.我知道托管DirectX有一些可变的结构,可以尽可能接近最佳性能,但这是以这种奇怪的情况为代价的 - 更糟糕的是,说实话.
我个人会给结构一个带X和Y的构造函数:
Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
det * (a11 * b.Y - a21 * b.X));
Run Code Online (Sandbox Code Playgroud)
它仍然没有初始化.您需要在使用之前对其进行初始化.default如果您不想创建静态Vec.Empty值并且对结构成员的默认值满意,则可以使用operator :
Vec2 x = default(Vec2);
Run Code Online (Sandbox Code Playgroud)
米奇小麦:
但是,这不是:
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;
}
Run Code Online (Sandbox Code Playgroud)
编译器阻止您在初始化所有类型成员之前调用属性上的属性,即使属性可能只设置其中一个值.正如Jon Skeet所提出的那样,解决方案是使用初始化构造函数,最好不要使用setter.
| 归档时间: |
|
| 查看次数: |
11072 次 |
| 最近记录: |