У меня есть проект XNA 3.0, который прекрасно компилируется в VS2008, но дает ошибки компиляции в VS2010 (с XNA 4.0 CTP). Ошибка:
Невозможно использовать фиксированный локальный параметр deepPtr внутри анонимного метода, лямбда-выражения или выражения запроса
depthPtr
- это fixed float*
в массиве, который используется внутри Parallel.For
лямбда-выражения из System.Threading
. Как я уже сказал, это скомпилировано и отлично работает на VS2008, но не на VS2010, даже при использовании .NET 3.5.
Изменилось ли это в .NET 4.0 и, даже если это так, разве он не должен компилироваться, когда я выбираю .NET 3.5 в качестве целевой платформы? Поиск по термину «Невозможно использовать фиксированный локальный» дает ровно один (бесполезный) результат, как в Google, так и в Bing.
Если это изменилось, в чем причина? Я могу себе представить, что захват fixed
типа указателя в замыкании может стать немного странным, поэтому? Так что я предполагаю, что это плохая практика? И прежде чем кто-либо спросит: нет, использование указателей здесь не является абсолютно критичным. Я все еще хотел бы знать, хотя:)
EDIT:
В соответствии с просьбой, образец кода (очевидно, не из моей программы), который воспроизводит ошибку:
static unsafe void Main(string[] args)
{
float[] array = new float[10];
fixed (float* ptr = array)
{
Parallel.For(0, 10, i =>
{
ptr[i] = i;
});
}
}
Вышеуказанное компилируется в VS2008 (ну, кроме ссылки на Parallel
, но подойдет любое другое лямбда-выражение), но не в VS2010.