У меня есть проект XNA 3.0, который отлично скомпилирован в VS2008, но дает ошибки компиляции в VS2010 (с XNA 4.0 CTP). Ошибка:
Нельзя использовать фиксированный локальный 'depthPtr' внутри анонимного метода, лямбда-выражения или выражения запроса.
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.