Javascript Float32 array throws Cannot read 属性 '0' of null 即使数组定义明确

Javascript Float32 array throws Cannot read property '0' of null even though array is well defined

在这里你可以看到调试window:http://i.imgur.com/ZnfeKT1.png 如您所见,该数组不是空的,实际上有 2 个元素。我到底为什么会收到那个错误?

编辑:此代码是用 C# 编写的,并通过 DuoCode 转换为 JS:

WebGL.Vector2 = $d.declare("WebGL.Vector2", null, 62, $asm, function($t, $p) {
$t.cctor = function() {
    $t.GLVector2 = vec2;
};
$t.ctor = function Vector2() {
    this.vec = null;
};
$t.ctor.prototype = $p;
$p.get_X = function Vector2_get_X() {
    return this.vec[0]; //this is line 777
};
$p.set_X = function Vector2_set_X(value) {
    this.vec[0] = value;
    return value;
};
$p.get_Y = function Vector2_get_Y() {
    return this.vec[1];
};
$p.set_Y = function Vector2_set_Y(value) {
    this.vec[1] = value;
    return value;
};
$p.get_Magnitude = function Vector2_get_Magnitude() {
    return Math.sqrt(this.get_X() * this.get_X() + this.get_Y() * this.get_Y());
};
$p.get_Normalized = function Vector2_get_Normalized() {
    var m = this.get_Magnitude();
    return WebGL.Vector2.op_Division(this, m);
};
$t.ctor = function Vector2() {
    this.vec = $d.array(System.Single, 2);
    this.set_X(0);
    this.set_Y(0);
};
$t.ctor.prototype = $p;
$t.ctor = function Vector2(x, y) {
    this.vec = $d.array(System.Single, 2);
    this.set_X(x);
    this.set_Y(y);
};
$t.ctor.prototype = $p;
$p.Rotated = function Vector2_Rotated(angle) {
    var rad = Math.PI * angle / 180;
    var cs = Math.cos(rad);
    var sn = Math.sin(rad);
    return new WebGL.Vector2.ctor(this.get_X() * cs - this.get_Y() * sn, this.get_X() * sn + this.get_Y() * cs);
};
$p.Transformed = function Vector2_Transformed(matrix) {
    var ret = new WebGL.Vector2.ctor();
    $t().GLVector2.transformMat3(ret.vec, this.vec, matrix.mat);
    return ret;
};
$t.op_Multiply = function Vector2_op_Multiply(v, f) {
    return new WebGL.Vector2.ctor(v.get_X() * f, v.get_Y() * f);
};
$t.op_Division = function Vector2_op_Division(v, f) {
    return new WebGL.Vector2.ctor(v.get_X() / f, v.get_Y() / f);
};
$t.op_Addition = function Vector2_op_Addition(v1, v2) {
    return new WebGL.Vector2.ctor(v1.get_X() + v2.get_X(), v1.get_Y() + v2.get_Y());
};
$t.op_Subtraction = function Vector2_op_Subtraction(v1, v2) {
    return new WebGL.Vector2.ctor(v1.get_X() - v2.get_X(), v1.get_Y() - v2.get_Y());
};
$t.Dot = function Vector2_Dot(v1, v2) {
    return v1.get_X() * v2.get_X() + v1.get_Y() * v2.get_Y();
};
$p.ToString = function Vector2_ToString() {
    return String.Format("[{0}, {1}]", $d.array(System.Object, [this.get_X(), this.get_Y()]));
};

});

好的,问题如下:出于某种原因,DuoCode 为结构生成了一个默认构造函数,该构造函数将值类型初始化为 null。我的自定义默认构造函数仅在我显式调用 Vector2 v = new Vector2() 时被调用。老实说,这种行为非常出乎意料,而且非常烦人。我希望这会在以后的版本中得到修复。

你是对的,这是一种不良行为,但它的发生是因为 C# 6 中的一个实验性功能(无参数构造函数)。通常 C# 禁止为结构声明默认构造函数,这就是为什么必须有一个自动默认构造函数来初始化结构(并将 null 设置为引用类型字段,如数组 "vec")。

C# 6 添加了主构造函数的选项 - 但微软已经意识到它太复杂了,我相信他们打算暂时放弃这个功能。

DuoCode 使用 Roslyn 进行编译,这就是此行为的原因。 Roslyn 和 DuoCode 的下一版本可能会禁止这样做。

我建议您将 Vector2 结构设为具有两个字段 (x, y) 的不可变结构 - 这样效果最好。

免责声明:我与 DuoCode 开发人员合作

编辑:糟糕,它被称为无参数构造函数