3

当我尝试像这样传递公共变量的地址时:

ML.Register("Radius", &lBeacons[i].Radius, 0.0f, 200.0f, 10.0f);

我收到此错误:

error CS0212: You can only take the address of an unfixed expression inside of a fixed statement initializer

注册函数如下所示:

public unsafe void Register(string desc, float* val, float minimum, float maximum, float stepsize)

信标是一个列表。它拥有一个具有公共半径的类。

4

4 回答 4

8

仅仅通过引用传递值没有意义吗?

public void Register(string desc, ref float val, float minimum,
         float maximum, float stepsize) {...}

当然,使用公共变量(字段)也是一个坏主意......它会像这样工作:

ML.Register("Radius", ref lBeacons[i].Radius, 0.0f, 200.0f, 10.0f);

但是,如果您创建财产,它将Radius不起作用-所以不要这样做。考虑传递信标(或类似的)本身,或其他一些基于对象(或可能基于事件)的机制。


就像是:

ML.Register("Radius", lBeacons[i], 0.0f, 200.0f, 10.0f);

和:

private Beacon beacon;
public void Register(string desc, Beacon beacon, float minimum,
         float maximum, float stepsize) {
    this.beacon = beacon;
}
void Foo() {
    beacon.Radius++; // etc
}

这里我们有一个对 Beacon 对象的引用,它没有unsafe指针的问题。如果您不想Beacon直接公开,请考虑使用接口。

于 2009-05-22T13:59:38.220 回答
4

要获取指向变量的指针,请使用 fixed 关键字将其固定到位,例如:

fixed(float *radius=&lBeacons[i].Radius)
{
  ML.Register("Radius", radius, 0.0f, 200.0f, 10.0f);
}

这个被放置的方法需要被声明为不安全的。

于 2009-05-22T14:03:29.227 回答
2

为什么要使用指针?您可以只使用“ref”关键字来传递变量的引用。

例子:

object blah = new object();

CallMethod(ref blah);


public void CallMethod(ref object param)
{

}
于 2009-05-22T13:58:12.230 回答
0

您可以尝试使用固定块。

fixed(float *rad = &(lBeacons[i].Radius))) {
    ML.Register("Radius", rad, 0f, 200f, 10f);
}

我认为你无论如何都不想这样做。如果 ML 在固定块之外使用 rad,它很可能会失败。我认为你最好重新考虑你的 API。

于 2009-05-22T14:00:39.963 回答