Como resolver: 'Point' não tem um tamanho predefinido, portanto sizeof só pode ser usado em um contexto unsafe
Resolva o erro de C# em que sizeof não pode ser usado com Point fora de um contexto unsafe. Duas soluções: habilitar código unsafe ou usar Marshal.SizeOf.
O erro que você está enfrentando ocorre porque, em C#, sizeof só pode ser usado com tipos que têm um tamanho predefinido conhecido em tempo de compilação, e a estrutura Point não é um desses tipos a menos que você esteja em um contexto unsafe.
Existem duas formas de resolver isso.
Usar código unsafe
Isso permitiria usar o operador sizeof com tipos de qualquer tamanho. Para fazê-lo, você precisará marcar seu método com a palavra-chave unsafe e também habilitar código unsafe nas configurações de build do seu projeto.
Basicamente, a assinatura do seu método muda para isto:
public static unsafe void YourMethod()
{
// ... your unsafe code
// IntPtr sizeOfPoint = (IntPtr)sizeof(Point);
}
E para permitir código unsafe, vá até as propriedades do projeto, à aba Build, e marque a opção “Allow unsafe code”. Depois disso, o erro de compilação deve desaparecer.
Usar Marshal.SizeOf
Marshal.SizeOf é seguro e não exige contexto unsafe. O método SizeOf retorna o tamanho não gerenciado de um objeto em bytes.
Tudo o que você precisa fazer é substituir sizeof(Point) por Marshal.SizeOf(typeof(Point)). Assim:
IntPtr sizeOfPoint = (IntPtr)Marshal.SizeOf(typeof(Point));
Marshal.SizeOf faz parte do namespace System.Runtime.InteropServices, então certifique-se de incluir a diretiva using correspondente no topo do seu arquivo:
using System.Runtime.InteropServices;
Vale notar que Marshal.SizeOf traz uma penalidade de desempenho muito pequena em comparação com o sizeof unsafe. É algo que você pode querer levar em conta ao escolher a solução que melhor atende às suas necessidades.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.