所以我反思一些框架2.0代码并最终得到以下解构
fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}
由于“The right hand side of a fixed statement assignment may not be a cast expression
”
我知道Reflector只能近似,一般我可以看到一条清晰的路径,但这有点超出了我的经验。
问题: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)
答案 0 :(得分:2)
它取_someMember
的地址并将其转换为(void *)
(即指针地址),然后将位置设置为该地址。
fixed
语句'固定'对象,并阻止GC移动它。
'&'在该上下文中使用的是'Address Of'运算符,而不是Bitwise And。
回应更新的问题:
你试过了吗?
fixed (void* voidRef3 = &_someMember)
{
...
}
答案 1 :(得分:0)
回复你的上一条评论:这对你有用吗?
fixed (IntPtr* ptrRef3 = (IntPtr *) &_someMember)
修改强>
我不确定你的意思
这实际上是什么反射器 给了我
你提到的错误似乎很清楚:如果你问的话,它可以显式地从(void *)转换为(IntPtr *)。我的例子问,你的没有。
插入(IntPtr *)
时,您是否真的收到相同的错误消息?
另一个编辑
有人可以验证
fixed (void* ptrRef3 = &_someMember)
相当于
fixed (IntPtr* ptrRef3 = &_someMember)
首先:是的,它们是等价的。
其次:我一直在考虑这一切意味着什么。我认为反编译器认为它不足以创建一个对_someMember的可移动引用,因此不能将它留给C#运行时来管理它。为了解决这个问题,它使用fixed
来禁用该内存的垃圾收集,让它告诉运行时什么时候可以安全地解除分配。
因此,这不是您应该保留的代码:只要您弄清楚该位数据的真实含义和生命周期,请将其重写为使用常规(垃圾收集)变量。