次の方法で共有


安全でないコード コンストラクトのエラーと警告を解決する

この記事では、次のコンパイラ エラーについて説明します。

  • CS0193: * 演算子または -> 演算子をデータ ポインターに適用する必要があります
  • CS0196: ポインターは 1 つの値でのみインデックスを作成する必要があります
  • CS0208: マネージド型 ('type') のアドレスを取得したり、サイズを取得したり、ポインターを宣言したりすることはできません
  • CS0209: 固定ステートメントで宣言されるローカルの型はポインター型である必要があります
  • CS0210: 固定または using ステートメント宣言で初期化子を指定する必要があります
  • CS0211: 指定された式のアドレスを取得できません
  • CS0212: 固定ステートメント初期化子内の固定されていない式のアドレスのみを受け取ることができます
  • CS0213: fixed ステートメントを使用して、既に固定された式のアドレスを取得することはできません
  • CS0214: ポインターと固定サイズ バッファーは、安全でないコンテキストでのみ使用できます
  • CS0227: アンセーフ コードは、/unsafe を使用してコンパイルする場合にのみ表示される場合があります
  • CS0233: 'identifier' には定義済みのサイズがないため、sizeof は安全でないコンテキストでのみ使用できます
  • CS0242: 問題の操作は void ポインターで未定義です
  • CS0244: ポインター型で 'is' と 'as' のどちらも有効ではありません
  • CS0254: 固定ステートメント割り当ての右側はキャスト式ではない可能性があります
  • CS0459: 読み取り専用ローカル変数のアドレスを取得できません
  • CS0821: 暗黙的に型指定されたローカルを修正できません
  • CS1641: 固定サイズのバッファー フィールドには、フィールド名の後に配列サイズ指定子が必要です
  • CS1642: 固定サイズのバッファー フィールドは、構造体のメンバーのみである場合があります。
  • CS1656: 'variable' は '読み取り専用変数型' であるため、'variable' に割り当てることができません
  • CS1663: 固定サイズバッファーの種類は、boolbyteshortintlongcharsbyteushortuintulongfloat、またはdoubleのいずれかである必要があります
  • CS1665: 固定サイズ バッファーの長さが 0 より大きい必要があります
  • CS1666: 固定されていない式に含まれる固定サイズ バッファーを使用することはできません。fixed ステートメントを使用してみてください。
  • CS1708: 固定サイズ バッファーには、ローカルまたはフィールドを介してのみアクセスできます
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' 属性を使用しないでください。代わりに 'fixed' フィールド修飾子を使用してください。
  • CS1919: 安全でない型 '型名' は、オブジェクトの作成で使用できません。
  • CS4004: 安全でないコンテキストで await できません
  • CS8812: &Methodグループを非関数ポインター型に変換できません。
  • CS9123: '&' 演算子は、非同期メソッドのパラメーターまたはローカル変数では使用しないでください。

ポインター操作と逆参照

  • CS0193: *演算子または->演算子をデータ ポインターに適用する必要があります
  • CS0196: ポインターは 1 つの値でのみインデックスを作成する必要があります
  • CS0242: 問題の操作は void ポインターで未定義です

ポインター操作を正しく使用するには、逆参照、インデックス作成、算術演算の規則に従います。 詳細については、「 ポインター型関数ポインター」を参照してください。

  • *または->演算子をデータ ポインターにのみ適用します (CS0193)。 これらの演算子は、非ポイント型または関数ポインターでは使用しないでください。 C/C++ とは異なり、C# では関数ポインターを逆参照することはできません。
  • 値が 1 つだけのインデックス ポインター (CS0196)。 ポインターでは、多次元インデックス作成はサポートされていません。
  • void ポインター (CS0242) で未定義の操作を避けます。 たとえば、参照されているデータのサイズがコンパイラで認識されないため、void ポインターをインクリメントしないでください。

ポインター型とマネージド型

  • CS0208: マネージド型 ('type') のアドレスを取得したり、サイズを取得したり、ポインターを宣言したりすることはできません
  • CS0233: 'identifier' には定義済みのサイズがないため、sizeof は安全でないコンテキストでのみ使用できます

ポインターと sizeof 演算子を正しく操作するには、アンマネージ型と適切なコンテキストを使用します。 詳細については、「 アンマネージ型sizeof 演算子」を参照してください。

  • ポインターはアンマネージ型 (CS0208) でのみ使用します。 マネージド型のアドレスを取得したり、サイズを取得したり、マネージド型へのポインターを宣言したりしないでください。 マネージド型には、参照型のフィールドまたはプロパティを含む参照型と構造体が含まれます。
  • サイズがコンパイル時定数 (sizeof) ではない型を操作する場合は、unsafe コンテキスト内で 演算子を使用します。

固定バッファー

  • CS0209: 固定ステートメントで宣言されるローカルの型はポインター型である必要があります
  • CS0210: 固定または using ステートメント宣言で初期化子を指定する必要があります
  • CS0211: 指定された式のアドレスを取得できません
  • CS0212: 固定ステートメント初期化子内の固定されていない式のアドレスのみを受け取ることができます
  • CS0213: fixed ステートメントを使用して、既に固定された式のアドレスを取得することはできません
  • CS0254: 固定ステートメント割り当ての右側はキャスト式ではない可能性があります
  • CS0459: 読み取り専用ローカル変数のアドレスを取得できません
  • CS0821: 暗黙的に型指定されたローカルを修正できません
  • CS1656: 'variable' は '読み取り専用変数型' であるため、'variable' に割り当てることができません

これらのエラーは、 fixed ステートメント を誤って使用した場合に発生します。 fixed ステートメントは、ガベージ コレクターが移動可能な変数を再配置するのを防ぎ、その変数へのポインターを宣言します。 詳細については、「 安全でないコードとポインター」を参照してください。

fixed ステートメントを正しく使用するには:

  • 変数をポインター型として宣言します (CS0209)。
  • fixed ステートメント宣言 (CS0210) で初期化子を指定します。
  • 有効な式のアドレスのみを取得します。フィールド、ローカル変数、ポインター間接参照 (CS0211)。 2 つの変数の合計のような計算式のアドレスを取得しないでください。
  • fixed ステートメント初期化子 (CS0212) 内でのみ、修正されていない式に対して address-of 演算子を使用します。
  • 既に固定された式 (fixed) では、ステートメントを使用しないでください。 unsafe メソッドのローカル変数とパラメーターは、スタック上で既に固定されています。
  • fixed ステートメント割り当ての右側にキャスト式を使用しないでください (CS0254)。
  • 読み取り専用ローカル変数 (CS0459) のアドレスを取得しないでください。 foreach ループ、using ステートメント、および fixed ステートメント内の変数は読み取り専用です。
  • var ステートメント (fixed) では、の代わりに明示的な型を使用します。
  • foreach ループ、using ステートメント、fixed ステートメント (CS1656) などの読み取り専用コンテキストでは変数に割り当てないでください。

安全でないコンテキストの制限

  • CS0214: ポインターと固定サイズ バッファーは、安全でないコンテキストでのみ使用できます
  • CS0227: アンセーフ コードは、/unsafe を使用してコンパイルする場合にのみ表示される場合があります
  • CS0244: ポインター型で 'is' も 'as' も有効ではありません
  • CS1919: 安全でない型 '型名' をオブジェクトの作成で使用できません
  • CS4004: 安全でないコンテキストで待機できません
  • CS9123: '> 演算子は、非同期メソッドのパラメーターまたはローカル変数では使用しないでください

これらのエラーは、適切な安全でないコンテキストなしで安全でないコード コンストラクトを使用する場合、または安全でないコードで許可されていない操作を試みた場合に発生します。 詳細については、「安全でないコードとポインター」およびunsafe キーワード」を参照してください。

安全でないコードを正しく使用するには:

  • ポインターまたは固定サイズバッファーを使用するメソッド、型、またはコード ブロックを、 unsafe キーワード (CS0214) でマークします。
  • キーワード (CS0227) を使用する場合は、プロジェクト設定で unsafe コンパイラ オプションを有効にします。
  • ポインター型 (is) でas演算子または演算子を使用しないでください。 これらの型テスト演算子は、ポインターに対しては有効ではありません。
  • ポインター型インスタンス (new) を作成するには、演算子を使用しないでください。 アンマネージ メモリにオブジェクトを作成するには、相互運用機能を使用して、ポインターを返すネイティブ メソッドを呼び出します。
  • 安全でないコードを非同期コード (CS4004) とは別に保持します。 安全でない操作用に個別のメソッドを作成し、非同期メソッドから呼び出します。
  • 非同期メソッド (&) のパラメーターまたはローカル変数に対して address-of 演算子 () を使用しないでください。 非同期操作の完了時に変数が存在しない場合があります。

固定サイズ バッファー

  • CS1641: 固定サイズのバッファー フィールドには、フィールド名の後に配列サイズ指定子が必要です
  • CS1642: 固定サイズのバッファー フィールドは構造体のメンバーのみである場合があります
  • CS1663: 固定サイズのバッファーの種類は、ブール値、バイト型、short 型、int 型、long 型、char 型、sbyte 型、ushort 型、uint 型、ulong 型、float 型、double 型のいずれかである必要があります
  • CS1665: 固定サイズ バッファーの長さが 0 より大きい必要があります
  • CS1666: 固定されていない式に含まれる固定サイズのバッファーは使用できません。fixed ステートメントを使用してみてください。
  • CS1708: 固定サイズ バッファーには、ローカルまたはフィールドを介してのみアクセスできます
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' 属性を使用しないでください。代わりに 'fixed' フィールド修飾子を使用してください

これらのエラーは、固定サイズのバッファーを操作するときに発生します。 固定サイズ バッファーは構造体に直接埋め込まれた配列であり、主に相互運用シナリオに使用されます。 詳細については、「 固定サイズバッファー」を参照してください。

固定サイズバッファーを正しく宣言して使用するには:

  • 正の整数定数 (CS1641、CS1665) を使用して、フィールド名の後の配列サイズ 指定します。
  • 固定サイズ バッファーは、クラスではなく構造体でのみ宣言します (CS1642)。 クラスにフィールドが必要な場合は、通常の配列を使用します。
  • サポートされている要素の種類 ( boolbyteshortintlongcharsbyteushortuintulongfloat、または double ( CS1663) のいずれかを使用します。
  • バッファー (fixed) にアクセスする前に、 ステートメントを使用して包含構造体をピン留めします。
  • 固定サイズ バッファーには、中間式 (CS1708) ではなく、ローカルまたはフィールド経由でのみアクセスします。
  • fixed属性 (System.Runtime.CompilerServices.FixedBuffer) の代わりに、 フィールド修飾子を使用します。

関数ポインター

  • CS8812: &Method グループを非関数ポインター型に変換できません

関数ポインターを取得するには、明示的な関数ポインター型キャストで address-of 演算子を使用します。 address-of 演算子&を使用して、メソッド グループをvoid*またはその他の非関数ポインター型に割り当てないでください。 詳細については、「 関数ポインター」を参照してください。