В целях обучения я недавно посмотрел на существующую сборку (используя Reflector), которая использует Win32 WriteFile. Реализация:
Write(IntPtr handleFile, void* bufferData, uint length){
void* buffer = bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This does not compile, because of the cast but also simply because void* does not have += operators (it is unknown size).
buffer += (void*)wrtn;
len -= wrtn;
}
}
На самом деле проблемными являются последние 2 строки ... Например, компилятор жалуется, что вы не можете привести uint к void *. Кроме того, просто невозможно использовать + = или даже + на void *, потому что он не имеет известного размера.
Write(IntPtr handleFile, void* bufferData, uint length){
byte* buffer = (byte*)bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, (void*)buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This works! I can add to a byte*
buffer = buffer + wrtn; // I could also have used buffer += wrtn
len -= wrtn;
}
}
Приведенный выше код работает, но последние несколько строк будут скомпилированы в:
buffer += (byte*)wrtn;
Я не понимаю, почему и очень хотел бы знать, почему компилятор ведет себя так:
- Почему он генерирует приведение вот так (и почему не допускается делать это в написанном пользователем коде)?
- Что случилось с операторами + = на void * в первом примере? Какой исходный код кода сгенерировал буфер + = (void *) wrtn, где buffer также void * ????