当我尝试传递这样一个公共变量的地址时:
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
Register函数如下所示:
public unsafe void Register(string desc, float* val, float minimum, float maximum, float stepsize)
Beacons是一个列表。它拥有一个具有公共半径的类。
答案 0 :(得分:7)
仅通过引用传递值是否有意义?
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
,请考虑使用接口。
答案 1 :(得分:4)
要获取指向变量的指针,请使用fixed关键字将其固定到位,例如:
fixed(float *radius=&lBeacons[i].Radius)
{
ML.Register("Radius", radius, 0.0f, 200.0f, 10.0f);
}
放入的方法需要声明为不安全。
答案 2 :(得分:2)
为什么要使用指针?您可以使用“ref”关键字来传递变量的引用。
示例:
object blah = new object();
CallMethod(ref blah);
public void CallMethod(ref object param)
{
}
答案 3 :(得分:0)
您可以尝试使用固定块。
fixed(float *rad = &(lBeacons[i].Radius))) {
ML.Register("Radius", rad, 0f, 200f, 10f);
}
我认为你无论如何都不想这样做。如果ML在固定块之外使用rad,则可能会失败。我认为你最好重新考虑你的API。