Jul*_*anR 6 c# xna .net-4.0 .net-3.5 xna-3.0
我有一个在VS2008中编译得很好的XNA 3.0项目,但这会在VS2010中产生编译错误(使用XNA 4.0 CTP).错误:
不能在匿名方法,lambda表达式或查询表达式中使用固定的局部"depthPtr"
depthPtr是一个fixed float*数组,在Parallel.Forlambda表达式中使用System.Threading.正如我所说,这在VS2008上编译并运行得很好,但它在VS2010上却没有,即使是针对.NET 3.5.
这在.NET 4.0中有所改变,即便如此,当我选择.NET 3.5作为目标框架时,它是否应该仍然编译?搜索"无法使用固定本地"这一术语只能在Google和Bing中产生一个(无用的)结果.
如果这已经改变了,原因是什么?我可以想象fixed在闭包中捕获指针类型可能会有点奇怪,这是为什么?所以我猜这是不好的做法?在任何人问:不,在这里使用指针并不是绝对关键的.我还是想知道:)
编辑: 根据要求,重现错误的代码示例(显然不是来自我的程序):
static unsafe void Main(string[] args)
{
float[] array = new float[10];
fixed (float* ptr = array)
{
Parallel.For(0, 10, i =>
{
ptr[i] = i;
});
}
}
Run Code Online (Sandbox Code Playgroud)
以上编译在VS2008中(除了引用Parallel,但任何其他lambda表达式都可以),但在VS2010中没有.
固定在块的持续时间内固定一个指针。如果您要存储委托以供稍后在块退出后调用,则垃圾收集器可能会在创建 lambda 和调用 lambda 之间移动对象。至于为什么针对不同的框架没有帮助,这是因为这是由语言/编译器而不是运行时强制执行的(如果是运行时,它将在运行时通过异常或类似的方式报告,而不是由运行时报告)编译时的编译器)。
| 归档时间: |
|
| 查看次数: |
1628 次 |
| 最近记录: |