Start Debugging

エラー対処: 'Point' には事前定義されたサイズがないため、sizeof は unsafe コンテキストでしか使えない

unsafe コンテキスト外で sizeof を Point に対して使えない C# のエラーを解決します。unsafe コードを有効化する方法と、Marshal.SizeOf を使う方法の2つを紹介します。

このエラーが発生するのは、C# では sizeof がコンパイル時にサイズが決まっている型にしか使えず、Point 構造体は unsafe コンテキストでない限りそうした型には含まれないからです。

解決方法は2つあります。

unsafe コードを使う

これを使えば、任意のサイズの型に対して sizeof 演算子を使えます。そのためには、メソッドに unsafe キーワードを付け、プロジェクトのビルド設定で unsafe コードを有効化する必要があります。

メソッドのシグネチャは基本的に次のように変わります。

public static unsafe void YourMethod()
{
    // ... your unsafe code
    // IntPtr sizeOfPoint = (IntPtr)sizeof(Point);
}

unsafe コードを許可するには、プロジェクトのプロパティを開いて Build タブに移動し、「Allow unsafe code」オプションをオンにします。これでコンパイルエラーは解消されるはずです。

Marshal.SizeOf を使う

Marshal.SizeOf は安全で、unsafe コンテキストを必要としません。SizeOf メソッドはオブジェクトのアンマネージドサイズをバイト単位で返します。

やることは、sizeof(Point)Marshal.SizeOf(typeof(Point)) に置き換えるだけです。次のとおりです。

IntPtr sizeOfPoint = (IntPtr)Marshal.SizeOf(typeof(Point));

Marshal.SizeOfSystem.Runtime.InteropServices 名前空間に含まれるため、ファイル先頭に対応する using ディレクティブがあることを確認してください。

using System.Runtime.InteropServices;

注意点として、Marshal.SizeOf は unsafe な sizeof と比べてごくわずかにパフォーマンス上のオーバーヘッドがあります。自分の用途に合った解決策を選ぶ際には、その点も考慮するとよいでしょう。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る