2

所以我正在反射一些框架 2.0 代码并最终得到以下解构

fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}

由于“ The right hand side of a fixed statement assignment may not be a cast expression” ,这将无法编译

我知道反射器只能近似,通常我可以看到一条清晰的路径,但这有点超出我的经验。

问题:Reflector 试图向我描述什么?

更新:

我还看到以下内容

fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._someMember))

更新:

因此,正如 Mitch 所说,它不是按位运算符,而是 addressOf 运算符。

现在的问题是:

fixed (IntPtr* ptrRef3 = &_someMember)

失败并出现“ Cannot implicitly convert type 'xxx*' to 'System.IntPtr*'. An explicit conversion exists (are you missing a cast?)”编译错误。

因此,如果我这样做,我似乎该死,如果我不这样做,我似乎该死。有任何想法吗?

更新:

我想我想通了。偶然地,我回到使用void*并删除演员表的表达,VS停止抱怨,因为我从这次对话的参与者那里收集到void*并且intptr*是等价的,所以我只是将它们换掉,结果是:

fixed (void* ptrRef3 = &_someMember)

VS 不再抱怨了。有人可以验证

fixed (void* ptrRef3 = &_someMember)

相当于

fixed (IntPtr* ptrRef3 = &_someMember)

?

4

2 回答 2

2

它获取地址_someMember并将其转换为(void *)(即指针地址),然后将位置设置为该地址。

fixed语句“固定”对象,并防止 GC 移动它。

在该上下文中使用的“&”是“地址”运算符,而不是按位与。

针对更新的问题:

你有没有尝试过:

fixed (void* voidRef3 = &_someMember) 
{ 
... 
}
于 2010-05-16T07:08:36.130 回答
0

回复您的最后一条评论:这对您有用吗?

fixed (IntPtr* ptrRef3 = (IntPtr *) &_someMember)

编辑

我不确定你是什么意思

这实际上是反射器给我的

你提到的错误似乎很清楚:如果你问,它可以显式地从 (void *) 转换为 (IntPtr *) 。我的例子问,你的没有。

插入时是否真的收到相同的错误消息(IntPtr *)

另一个编辑

有人可以验证

fixed (void* ptrRef3 = &_someMember)

相当于

fixed (IntPtr* ptrRef3 = &_someMember)

首先:是的,它们是等价的。

其次:我一直在思考这一切意味着什么。我认为反编译器认为它不足以创建对 _someMember 的可移动引用,因此不能将其留给 C# 运行时来管理它。为了解决这个问题,它使用fixed禁用该内存的垃圾收集,让您告诉运行时何时可以安全地释放。

因此,这不是您应该保留的代码:一旦您弄清楚该数据位的真正含义和生命周期,就将其重写为使用常规(垃圾收集)变量。

于 2010-05-16T09:28:43.327 回答