C# / XNA扩展设置实例属性

3

我将为Vector2类编写一个扩展。在我的主要代码中,我可以这样说:

Vector2 v=new Vector2();
v.X=2;

但是在我的扩展中,我不能这样做。

public static void SetToThree(this Vector2 vector)
{
    vector.X=3;       
}

v.SetToThree()不会改变v的值。 当我逐行查看代码时,在扩展向量的X方向上被更改为3,但在扩展完成后,主要代码继续执行时,v根本没有改变。 有没有办法让扩展方法SetToThree改变v的值?

1个回答

4

虽然它看起来像一个实例方法,但它的操作方式更像是一个静态方法——所以arg0 (this) 不是 ref,而是按值传递,因此您修改的是结构体的一个副本。由于您无法在扩展方法的第一个参数上使用ref,因此您必须将其作为return返回:

public static Vector2 SetToThree(this Vector2 vector)
{
    vector.X=3;
    return vector;
}

并使用:

v = v.SetToThree();

所以可能不值得...


或者,如果可能的话,将Vector改为一个类(应该通过引用传递)而不是一个结构体(按值传递)。 - Andy Jacobs
@Andy - 那是一种常见的现有XNA类型。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接