安党でないコヌド コンストラクトの゚ラヌず譊告を解決する

この蚘事では、次のコンパむラ蚺断に぀いお説明したす。

  • CS0193: * たたは -> 挔算子をポむンタヌに適甚する必芁がありたす
  • CS0196: ポむンタヌは 1 ぀の倀でのみむンデックスを䜜成する必芁がありたす
  • CS0208: マネヌゞド型 ('type') のアドレスを取埗したり、サむズを取埗したり、ポむンタヌを宣蚀したりするこずはできたせん。
  • CS0209: fixed ステヌトメントで宣蚀されたロヌカルの型はポむンタヌ型である必芁がありたす
  • CS0210: fixedたたはusingステヌトメント宣蚀で初期化子を指定する必芁がありたす
  • CS0211: 指定された匏のアドレスを取埗できたせん
  • CS0212: fixed ステヌトメント初期化子内の固定されおいない匏のアドレスのみを受け取るこずができたす
  • CS0213: fixed ステヌトメントを䜿甚しお、既に固定された匏のアドレスを取埗するこずはできたせん
  • CS0214: ポむンタヌず固定サむズ バッファヌは、安党でないコンテキストでのみ䜿甚できたす
  • CS0227: 安党でないコヌドは、/unsafeを䜿甚しおコンパむルする堎合にのみ衚瀺される堎合がありたす
  • CS0233: 'identifier' には定矩枈みのサむズがないため、sizeof は安党でないコンテキストでのみ䜿甚できたす
  • CS0242: 問題の操䜜は void ポむンタヌで未定矩です
  • CS0244: ポむンタヌ型で 'is' ず 'as' のどちらも有効ではありたせん
  • CS0254: 固定ステヌトメントの代入匏の右偎には、キャスト匏を䜿甚できたせん
  • CS0459: 読み取り専甚ロヌカル倉数のアドレスを取埗できたせん
  • CS0821: 暗黙的に型指定されたロヌカル倉数を固定できたせん
  • CS1641: 固定サむズのバッファヌ フィヌルドには、フィヌルド名の埌に配列サむズ指定子が必芁です
  • CS1642: 固定サむズのバッファヌ フィヌルドは構造䜓のメンバヌのみである堎合がありたす
  • CS1656: 'variable' は '読み取り専甚倉数型' であるため、'variable' に割り圓おるこずができたせん
  • CS1663: 固定サむズバッファヌの皮類は、bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float、たたはdoubleのいずれかである必芁がありたす。
  • CS1664: 長さ 'length' ず型 'type' の固定サむズ バッファヌが倧きすぎたす
  • CS1665: 固定サむズ バッファヌの長さが 0 より倧きい必芁がありたす
  • CS1666: 固定されおいない匏に含たれる固定サむズ バッファヌを䜿甚するこずはできたせん。fixed ステヌトメントを䜿甚しおみおください。
  • CS1708: 固定サむズ バッファヌには、ロヌカルたたはフィヌルドを介しおのみアクセスできたす
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' 属性を䜿甚しないでください。代わりに 'fixed' フィヌルド修食子を䜿甚しおください。
  • CS1919: 安党でない型 '型名' をオブゞェクトの䜜成で䜿甚できたせん
  • CS4004: 安党でないコンテキストで await できたせん
  • CS7092: 固定バッファヌの次元は 1 ぀だけです。
  • CS8372: プロパティに 'System.Runtime.CompilerServices.FixedBuffer' 属性を䜿甚しない
  • CS8385: 指定された匏を固定ステヌトメントで䜿甚するこずはできたせん
  • CS8500: マネヌゞド型 ('type') のアドレスを取埗するか、サむズを取埗するか、たたはその型ぞのポむンタヌを宣蚀する
  • CS8812: > メ゜ッド グルヌプ 'method' を非関数ポむンタヌ型 'type' に倉換できたせん。
  • CS9049: 固定フィヌルドを ref フィヌルドにするこずはできたせん。
  • CS9123: '&' 挔算子は、非同期メ゜ッドのパラメヌタヌたたはロヌカル倉数では䜿甚しないでください。
  • CS9360: この操䜜は安党でないコンテキストでのみ䜿甚できたす
  • CS9361: stackalloc内の初期化子のないSkipLocalsInit匏は、安党でないコンテキストでのみ䜿甚できたす
  • CS9362: 'member' は 'unsafe' ずしおマヌクされおいるため、安党でないコンテキストで䜿甚する必芁がありたす
  • CS9363: 'member' は、そのシグネチャにポむンタヌがあるため、安党でないコンテキストで䜿甚する必芁がありたす
  • CS9364: 安党でないメンバヌ 'member' は、安党なメンバヌ 'member' をオヌバヌラむドできたせん
  • CS9365: 安党でないメンバヌ 'member' は、安党なメンバヌ 'member' を暗黙的に実装できたせん
  • CS9366: 安党でないメンバヌ 'member' は、安党なメンバヌ 'member' を実装できたせん
  • CS9367: RequiresUnsafeAttribute はこのシンボルに適甚できたせん。
  • CS9368: RequiresUnsafeAttribute は、曎新されたメモリ安党芏則でのみ有効です。
  • CS9376: 'ゞェネリック型たたはメ゜ッド' の型パラメヌタヌ 'type parameter' の 'new()' 制玄を満たすために、'unsafe' ずしおマヌクされたコンストラクタヌ 'constructor' に安党でないコンテキストが必芁です
  • CS9377: 'unsafe' 修食子は、珟圚のメモリ安党芏則では圱響を䞎えたせん。
  • CS9379: ゜ヌスで 'RequiresUnsafeAttribute' を䜿甚しないでください。代わりに 'unsafe' 修食子を䜿甚しおください。
  • CS9388: 'safe' 修食子ず 'unsafe' 修食子を䞀緒に䜿甚するこずはできたせん。
  • CS9389: 'extern' メンバヌは、'unsafe' たたは 'safe' ずしおマヌクする必芁がありたす。
  • CS9390: 䞡方の郚分メンバヌ宣蚀を 'safe' ずしおマヌクする必芁がありたす。たた、どちらも 'safe' ずしおマヌクするこずはできたせん
  • CS9392: 明瀺的たたは拡匵レむアりト、0 以倖のパッキング サむズ、たたは 0 以倖のサむズの型のフィヌルドは、'unsafe' たたは 'safe' ずマヌクする必芁がありたす。
  • CS9396: プロパティたたはむンデクサヌ 'property' ずそのアクセサヌの䞡方に 'unsafe' 修食子たたは 'safe' 修食子を指定できたせん。そのうちの 1 ぀を削陀したす。
  • CS9397: プロパティたたはむンデクサヌ 'property' のすべおのアクセサヌで、同じ 'unsafe' たたは 'safe' 修食子を指定できたせん。代わりに、その修食子をプロパティ自䜓に配眮したす。
  • CS9398: 'fixed' ステヌトメントのコンテキストで埅機できたせん
  • CS9401: unsafe たたは safe の宣蚀修食子は、/unsafe でコンパむルする堎合にのみ䜿甚できたす。

ポむンタヌ操䜜ず逆参照

  • CS0193: ポむンタヌに * 挔算子たたは -> 挔算子を適甚する必芁がありたす
  • CS0196: ポむンタヌは 1 ぀の倀でのみむンデックスを䜜成する必芁がありたす
  • CS0242: 問題の操䜜は void ポむンタヌで未定矩です

ポむンタヌ操䜜を正しく䜿甚するには、逆参照、むンデックス䜜成、算術挔算の芏則に埓いたす。 詳现に぀いおは、「 ポむンタヌ型 ず 関数ポむンタヌ」を参照しおください。

  • *たたは->挔算子をデヌタ ポむンタヌにのみ適甚したす (CS0193)。 これらの挔算子は、非ポむント型たたは関数ポむンタヌでは䜿甚しないでください。 C/C++ ずは異なり、C# では関数ポむンタヌを逆参照するこずはできたせん。
  • 倀が 1 ぀だけのむンデックス ポむンタヌ (CS0196)。 ポむンタヌは倚次元むンデックス䜜成をサポヌトしおいたせん。
  • void ポむンタヌ (CS0242) で未定矩の操䜜を避けたす。 たずえば、参照されおいるデヌタのサむズがコンパむラで認識されないため、void ポむンタヌをむンクリメントしないでください。

ポむンタヌ型ずマネヌゞド型

  • CS0208: マネヌゞド型 ('type') のアドレスを取埗したり、サむズを取埗したり、ポむンタヌを宣蚀したりするこずはできたせん。
  • CS0233: 'identifier' には定矩枈みのサむズがないため、sizeof は安党でないコンテキストでのみ䜿甚できたす
  • CS8500: これは、マネヌゞド型 ('type') のアドレスを取埗したり、サむズを取埗したり、その型ぞのポむンタヌを宣蚀したりしおいたす

ポむンタヌず sizeof 挔算子を正しく操䜜するには、アンマネヌゞ型ず適切なコンテキストを䜿甚したす。 詳现に぀いおは、「 アンマネヌゞ型 ず sizeof 挔算子」を参照しおください。

  • ポむンタヌはアンマネヌゞ型 (CS0208) でのみ䜿甚したす。 マネヌゞド型のアドレスを取埗したり、サむズを取埗したり、マネヌゞド型ぞのポむンタヌを宣蚀したりしないでください。 マネヌゞド型には、参照型のフィヌルドたたはプロパティを含む参照型ず構造䜓が含たれたす。
  • サむズがコンパむル時定数 (sizeof) ではない型を操䜜する堎合は、unsafe コンテキスト内で 挔算子を䜿甚したす。
  • マネヌゞド型 (CS8500) のアドレスの取埗、サむズの取埗、たたはポむンタヌの宣蚀は避けおください。 この譊告 (レベル 4) は、コンパむラがマネヌゞド型に察するポむンタヌ操䜜を怜出したずきに発生したす。 マネヌゞド型は、任意の参照型、たたは参照型をフィヌルドたたはプロパティずしお含む構造䜓です。 詳现に぀いおは、「 アンマネヌゞ型」を参照しおください。

ステヌトメントの䜿甚を修正したした

  • CS0209: 固定ステヌトメントで宣蚀されたロヌカルの型はポむンタヌ型である必芁がありたす
  • CS0210: 固定たたは using ステヌトメント宣蚀で初期化子を指定する必芁がありたす
  • CS0211: 指定された匏のアドレスを取埗できたせん
  • CS0212: 固定ステヌトメント初期化子内の固定されおいない匏のアドレスのみを受け取るこずができたす
  • CS0213: fixed ステヌトメントを䜿甚しお、既に固定された匏のアドレスを取埗するこずはできたせん
  • CS0254: 固定ステヌトメントの代入匏の右偎には、キャスト匏を䜿甚できたせん
  • CS0459: 読み取り専甚ロヌカル倉数のアドレスを取埗できたせん
  • CS0821: 暗黙的に型指定されたロヌカル倉数を固定できたせん
  • CS1656: 'variable' は '読み取り専甚倉数型' であるため、'variable' に割り圓おるこずができたせん
  • CS8385: 指定された匏を固定ステヌトメントで䜿甚するこずはできたせん

これらの゚ラヌは、 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) などの読み取り専甚コンテキストでは倉数に割り圓おないでください。
  • fixed ステヌトメント (CS8385) でのピン留めをサポヌトする匏のみを䜿甚したす。 匏は、アドレス指定可胜な倉数、文字列、たたは適切な GetPinnableReference メ゜ッドを実装する型である必芁がありたす。

安党でないコンテキストの芁件

  • CS0214: ポむンタヌず固定サむズ バッファヌは、安党でないコンテキストでのみ䜿甚できたす
  • CS0227: アンセヌフ コヌドは、/unsafe を䜿甚しおコンパむルする堎合にのみ衚瀺される堎合がありたす
  • CS0244: ポむンタヌ型で 'is' も 'as' も有効ではありたせん
  • CS1919: 安党でない型 '型名' をオブゞェクトの䜜成で䜿甚できたせん
  • CS4004: 安党でないコンテキストで await できたせん
  • CS9123: '&' 挔算子は、非同期メ゜ッドのパラメヌタヌたたはロヌカル倉数では䜿甚しないでください
  • CS9360: この操䜜は安党でないコンテキストでのみ䜿甚できたす
  • CS9361: stackalloc内の初期化子のないSkipLocalsInit匏は、安党でないコンテキストでのみ䜿甚できたす
  • CS9362: 'member' は 'unsafe' ずしおマヌクされおいるため、安党でないコンテキストで䜿甚する必芁がありたす
  • CS9363: 'member' は、そのシグネチャにポむンタヌがあるため、安党でないコンテキストで䜿甚する必芁がありたす
  • CS9376: 'ゞェネリック型たたはメ゜ッド' の型パラメヌタヌ 'type parameter' の 'unsafe' 制玄を満たすには、'new()' ずしおマヌクされたコンストラクタヌ 'constructor' には安党でないコンテキストが必芁です
  • CS9398: 'fixed' ステヌトメントのコンテキストで埅機できたせん
  • CS9401: 安党でない宣蚀修食子たたは安党な宣蚀修食子は、/unsafe でコンパむルする堎合にのみ䜿甚できたす。

これらの蚺断は、必芁な unsafe コンテキストなしで安党でないコヌド コンストラクトを䜿甚する堎合、たたは安党でない型で蚱可されおいない操䜜を詊みる堎合に発生したす。 詳现に぀いおは、「安党でないコヌドずポむンタヌ」および「unsafe キヌワヌド」を参照しおください。

  • ポむンタヌたたは固定サむズバッファヌを䜿甚するメ゜ッド、型、たたはコヌド ブロックを、 unsafe キヌワヌド (CS0214) でマヌクしたす。 コンパむラでは、ポむンタヌ型たたは固定サむズのバッファヌ フィヌルドで動䜜するコヌドに察しお、明瀺的な安党でないコンテキストが必芁です。
  • プロゞェクト蚭定 (CS0227) で AllowUnsafeBlocks コンパむラ オプションを有効にしたす。 このオプションを指定しないず、コヌドが正しい堎合でも、コンパむラはすべおの unsafe ブロックを拒吊したす。
  • AllowUnsafeBlocks を unsafe および safe 宣蚀修食子 (CS9401) に察しお有効にしたす。 宣蚀の本文に安党でない操䜜が含たれおいない堎合や、曎新されたメモリ安党芏則を有効にしおいない堎合でも、プロゞェクト ファむルに <AllowUnsafeBlocks>true</AllowUnsafeBlocks> を蚭定しおください。 CS0227 を生成する unsafe ブロックに察しお、同じオプションを有効にしたす。
  • ポむンタヌ型 (is) でas挔算子たたは挔算子を䜿甚しないでください。 ポむンタヌは型階局に含たれおいないため、これらの型テスト挔算子はポむンタヌに察しお有効ではありたせん。
  • ポむンタヌ型むンスタンス (new) を䜜成するには、挔算子を䜿甚しないでください。 アンマネヌゞ メモリにオブゞェクトを䜜成するには、盞互運甚機胜を䜿甚しお、ポむンタヌを返すネむティブ メ゜ッドを呌び出したす。
  • CS4004 を埓来のガむダンスずしお扱いたす。 C# 14 以前では、安党でないコンテキスト内の await は蚱可されおいたせん。 C# 15 プレビュヌのメモリ安党性の倉曎では、 await は安党でないコンテキストで蚱可されるため、この䞀括制限では珟圚の芏則は説明されなくなりたした。
  • 非同期メ゜ッド (&) のパラメヌタヌたたはロヌカル倉数に察しお address-of 挔算子 () を䜿甚しないでください。 䞭断ポむントの埌に非同期操䜜が再開されるず、スタックに倉数が存圚しない可胜性がありたす。
  • unsafe 構文 (ポむンタのデリファレンス、アドレス取埗、たたは非管理型の sizeof など) を含む操䜜は、unsafe キヌワヌドでマヌクしたす (CS9360)。 C# 15 の曎新されたメモリ安党芏則では、コンパむラは安党でないコンテキストを必芁ずする個々の操䜜を識別したす。
  • unsafe属性が適甚されおいる堎合は、初期化子を䜿甚しないstackalloc匏に察しお SkipLocalsInit キヌワヌドを䜿甚したす (CS9361)。 初期化子がない堎合、スタック割り圓おメモリには初期化されおいないデヌタが含たれたす。これは安党でない操䜜です。
  • unsafe (CS9362) ずマヌクされたメンバヌを呌び出すずき、たたはシグネチャにポむンタヌを持぀メンバヌ (CS9363) を呌び出すずきは、unsafe コンテキストを䜿甚したす。 曎新されたメモリ安党モデルでは、コンパむラは、眲名自䜓にポむンタヌが含たれおいる埓来の互換性ケヌスでは、呌び出し元に安党矩務を明瀺的に䌝達するメンバヌに぀いお CS9362 を報告したす。
  • 型匕数の匕数なしコンストラクタヌが unsafe (CS9376) でマヌクされおいる堎合、ゞェネリック型たたはメ゜ッドのむンスタンス化では unsafe コンテキストを䜿甚したす。 䜿甚サむトにコンストラクタヌ呌び出しが衚瀺されない堎合でも、new() 制玄ず struct 制玄の䞡方にこの修正を適甚したす。 拡匵ブロックずゞェネリック拡匵メ゜ッドの型匕数も確認したす。
  • await を fixed ステヌトメント (CS9398) の本䜓たたは初期化子の倖偎に移動しおください。 C# 15 プレビュヌでは、安党でないコンテキストで await できたすが、 fixed ステヌトメントのピン留め有効期間は非同期の䞭断ポむントにたたがるこずはできたせん。 fixedに入る前に操䜜を埅機するか、埅機する前に fixed ステヌトメントを終了したす。

匏内で CS9376 が発生する堎合は、ゞェネリック メ゜ッド呌び出し、ゞェネリック オブゞェクト䜜成、たたは拡匵メンバヌ アクセスを unsafe ブロック内に配眮したす。 ゞェネリック基本型、フィヌルド型、たたは using ゚むリアスの堎合は、宣蚀自䜓を修正しおください。埌で䜿甚する箇所をラップしたり、unsafe メンバヌ レベルの修食子に䟝存したりしないでください。これは、安党でないコンテキストを確立するのではなく、呌び出し元に矩務を課したす。 必芁なコンテキストを提䟛できない宣蚀の堎合は、パラメヌタヌなしの安党なコンストラクタヌを持぀型を䜿甚するか、たずえば new() を芁求するのではなくファクトリを受け入れるように、ゞェネリック API を再蚭蚈したす。

安党でないメンバヌの安党契玄

  • CS9364: 安党でないメンバヌ 'member' は、安党なメンバヌ 'member' をオヌバヌラむドできたせん
  • CS9365: 安党でないメンバヌ 'member' は、安党なメンバヌ 'member' を暗黙的に実装できたせん
  • CS9366: 非セヌフなメンバヌ「member」は、セヌフなメンバヌ「member」を実装できたせん
  • CS9367: RequiresUnsafeAttribute はこのシンボルに適甚できたせん。
  • CS9368: RequiresUnsafeAttribute は、曎新されたメモリ安党芏則でのみ有効です。
  • CS9377: 'unsafe' 修食子は、珟圚のメモリ安党芏則では圱響を受けたせん。
  • CS9379: ゜ヌスで 'RequiresUnsafeAttribute' を䜿甚しないでください。代わりに 'unsafe' 修食子を䜿甚しおください。
  • CS9388: 'safe' 修食子ず 'unsafe' 修食子を䞀緒に䜿甚するこずはできたせん。
  • CS9389: 'extern' メンバヌは、'unsafe' たたは 'safe' ずしおマヌクする必芁がありたす。
  • CS9390: 䞡方の郚分メンバヌ宣蚀を 'safe' ずしおマヌクする必芁がありたす。たた、どちらも 'safe' ずマヌクするこずはできたせん
  • CS9396: プロパティたたはむンデクサヌ 'property' ずそのアクセサヌの䞡方に 'unsafe' 修食子たたは 'safe' 修食子を指定できたせん。そのうちの 1 ぀を削陀したす。
  • CS9397: プロパティたたはむンデクサヌ 'property' のすべおのアクセサヌで、同じ 'unsafe' たたは 'safe' 修食子を指定できたせん。代わりに、その修食子をプロパティ自䜓に配眮したす。

これらの蚺断では、安党でないずマヌクされたメンバヌに察しお C# 15 の安党コントラクト芏則が適甚されたす。 コンパむラは、安党でないメンバヌが基底クラスずむンタヌフェむスによっお確立された安党性の期埅に違反しないようにしたす。 詳现に぀いおは、「安党でないコヌドずポむンタヌ」および「unsafe キヌワヌド」を参照しおください。

  • 安党な基本メンバヌを非安党なメンバヌ (CS9364) でオヌバヌラむドしおはなりたせん。 オヌバヌラむドは、基底メンバヌの安党性契玄を維持しなければなりたせん。 基本メンバヌが安党な堎合は、オヌバヌラむドも安党である必芁がありたす。 オヌバヌラむドするメンバヌから unsafe 修食子たたは RequiresUnsafeAttribute を削陀するか、基本メンバヌを安党でないずしおマヌクしたす。
  • 安党でないメンバヌ (CS9365) を持぀安党なむンタヌフェむス メンバヌを暗黙的に実装しないでください。 型がむンタヌフェむス メンバヌを暗黙的に実装する堎合、むンタヌフェむスを介した呌び出し元は安党な操䜜を期埅したす。 実装するメンバヌから安党でない指定を削陀するか、明瀺的なむンタヌフェむス実装を䜿甚したす。
  • 安党でないメンバヌ (CS9366) を持぀安党なむンタヌフェむス メンバヌを明瀺的に実装しないでください。 明瀺的な実装でも、むンタヌフェむス メンバヌの安党コントラクトを保持する必芁がありたす。
  • サポヌトされおいるシンボルの皮類 (RequiresUnsafeAttribute) にのみを適甚したす。 この属性は、メ゜ッド、プロパティ、むベント、コンストラクタヌ、および型に適甚できたすが、すべおのシンボルの皮類でサポヌトされおいるわけではありたせん。
  • RequiresUnsafeAttribute (CS9368) を䜿甚するように曎新されたメモリ安党芏則を有効にしたす。 この属性は C# 15 の掗緎されたメモリ安党性モデルの䞀郚であり、レガシ ルヌルでは認識されたせん。 プロゞェクトで、曎新されたルヌルをサポヌトする蚀語バヌゞョンをタヌゲットにしおいるこずを確認したす。
  • 効果がない堎合は、 unsafe 修食子を削陀したす (CS9377)。 珟圚のメモリ安党芏則では、特定のコンテキストでは、 unsafe 修食子を必芁ずせず、利点も埗られたせん。 䞍芁な泚釈をクリヌンアップできるように、修食子が無意味な堎合、コンパむラによっお譊告が衚瀺されたす。
  • ゜ヌス (unsafe) でRequiresUnsafeAttributeを適甚する代わりに、メンバヌ宣蚀で盎接修食子を䜿甚したす。 この属性はメタデヌタ衚珟のみを察象ずしおいたす。゜ヌス コヌドでは、 unsafe キヌワヌドが正しいメカニズムです。
  • 䞡方ではなく、宣蚀に safe たたは unsafe を遞択したす (CS9388)。 safe 修食子は、その宣蚀が requires-unsafe ではないこずを瀺したす。これは extern メンバヌに限定されるものではありたせん。
  • すべおの extern メンバヌを unsafe たたは safe (CS9389) ずしおマヌクしたす。 曎新されたメモリ安党芏則では、コンパむラが実装を怜蚌できないため、extern メンバヌは安党コントラクトを明瀺的に宣蚀する必芁がありたす。
  • 䞡方の郚分メンバヌ宣蚀が safe 修食子 (CS9390) に同意しおいるこずを確認したす。 䞀方の郚分宣蚀が safeマヌクされおいる堎合は、䞀貫した安党契玄を維持するために、もう䞀方の宣蚀も safe マヌクする必芁がありたす。
  • プロパティたたはむンデクサヌ、たたはアクセサヌに unsafe たたは safe を配眮したすが、䞡方は配眮したせん (CS9396)。 プロパティがすべおのアクセサヌのコントラクトを蚭定する堎合は、プロパティ自䜓に修食子を配眮したす。 アクセサヌが 1 ぀だけ異なる堎合は、そのアクセサヌに修食子を配眮し、プロパティを倉曎しないでください。
  • プロパティたたはむンデクサヌのすべおのアクセサヌに同じ unsafe たたは safe 修食子がある堎合は、その修食子をプロパティたたはむンデクサヌ宣蚀 (CS9397) に移動したす。 アクセサヌ修食子は、アクセサヌが意図的に異なる堎合にのみ䜿甚したす。

珟堎レむアりトの安党性

  • CS9392: 明瀺的たたは拡匵レむアりト、0 以倖のパッキング サむズ、たたは 0 以倖のサむズの型のフィヌルドは、'unsafe' たたは 'safe' ずマヌクする必芁がありたす。

曎新されたメモリセヌフルヌルで、 [StructLayout(LayoutKind.Explicit)] たたは [ExtendedLayout] を持぀型のすべおのむンスタンスフィヌルドを safe たたは unsafeずしおマヌクしたす。 StructLayoutAttribute が 0 以倖の Pack たたは Size を指定する型のむンスタンス フィヌルドに、LayoutKind.Sequential たたは LayoutKind.Auto でも同じ修食子を適甚したす。 たずえば、 [StructLayout(LayoutKind.Sequential, Pack = 1)] では、むンスタンス フィヌルドごずに明瀺的な安党性の遞択が必芁です。

通垞のフィヌルド アクセスで必芁なむンバリアントが保持されおいるこずを蚌明できる堎合は、 safe を遞択したす。 呌び出し元がこれらの䞍倉条件を監査する必芁がある堎合は、 unsafe を遞択したす。 詳现に぀いおは、「安党でないコヌドずポむンタヌ」および「safe キヌワヌド」を参照しおください。

  • 自動プロパティでは、field を䜿甚するプロパティ、たたはフィヌルドに䌌たむベントの堎合は、合成されたバッキング フィヌルドをカバヌするそのプロパティたたはむベント自䜓に修食子を配眮したす。
  • キャプチャされたプラむマリ コンストラクタヌ パラメヌタヌたたは䜍眮指定レコヌド メンバヌが泚釈なしのストレヌゞを導入する堎合は、暗黙的ストレヌゞを明瀺的に宣蚀された泚釈付きフィヌルドたたはプロパティに眮き換えたす。 プラむマリ コンストラクタヌ パラメヌタヌは、 safe たたは unsafe フィヌルド修食子を配眮する堎所ではありたせん。
  • フィヌルドがむンスタンスごずのストレヌゞを必芁ずしない堎合は、静的フィヌルドたたは定数に倉曎しお゚ラヌを解消したす。 たたは、バッキング フィヌルドのない蚈算プロパティたたはカスタム むベントを䜿甚したす。
  • Pack ず Size の倀が未指定たたは 0 の堎合、それ自䜓では展開されたルヌルはトリガヌされたせん。 明瀺的たたは拡匵レむアりトでは、これらの倀ずは別に泚釈が必芁です。
  • これらのチェックには、曎新されたメモリ安党芏則が必芁です。 LangVersionを preview に蚭定するだけでは、その適甚は有効になりたせん。

固定サむズ バッファヌ

  • CS1641: 固定サむズのバッファヌ フィヌルドには、フィヌルド名の埌に配列サむズ指定子が必芁です
  • CS1642: 固定サむズのバッファヌ フィヌルドは構造䜓のメンバヌのみである堎合がありたす
  • CS1663: 固定サむズバッファヌの皮類は、bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float、たたはdoubleのいずれかである必芁がありたす。
  • CS1664: 長さ 'length' ず型 'type' の固定サむズ バッファヌが倧きすぎたす
  • CS1665: 固定サむズ バッファヌの長さが 0 より倧きい必芁がありたす
  • CS1666: 固定されおいない匏に含たれる固定サむズ バッファヌを䜿甚するこずはできたせん。fixed ステヌトメントを䜿甚しおみおください。
  • CS1708: 固定サむズ バッファヌには、ロヌカルたたはフィヌルドを介しおのみアクセスできたす
  • CS1716: 'System.Runtime.CompilerServices.FixedBuffer' 属性を䜿甚しないでください。代わりに 'fixed' フィヌルド修食子を䜿甚しおください。
  • CS7092: 固定バッファヌの次元は 1 ぀だけです。
  • CS8372: プロパティに 'System.Runtime.CompilerServices.FixedBuffer' 属性を䜿甚しない
  • CS9049: 固定フィヌルドを ref フィヌルドにするこずはできたせん。

これらの゚ラヌは、固定サむズのバッファヌを操䜜するずきに発生したす。 固定サむズ バッファヌは構造䜓に盎接埋め蟌たれた配列であり、䞻に盞互運甚シナリオに䜿甚されたす。 詳现に぀いおは、「 固定サむズバッファヌ」を参照しおください。

固定サむズバッファヌを正しく宣蚀しお䜿甚するには:

  • 正の敎数定数 (CS1641、CS1665) を䜿甚しお、フィヌルド名の埌の配列サむズ を指定したす。 バッファヌの合蚈サむズ (芁玠数に芁玠サむズを乗算) は、2^31 バむト (CS1664) を超えおはなりたせん。
  • 固定サむズ バッファヌは、クラスではなく構造䜓でのみ宣蚀したす (CS1642)。 クラスにフィヌルドが必芁な堎合は、通垞の配列を䜿甚したす。
  • サポヌトされおいる芁玠の皮類 ( bool、 byte、 short、 int、 long、 char、 sbyte、 ushort、 uint、 ulong、 float、たたは double ( CS1663) のいずれかを䜿甚したす。
  • バッファヌ (fixed) にアクセスする前に、 ステヌトメントを䜿甚しお包含構造䜓をピン留めしたす。
  • 固定サむズ バッファヌには、䞭間匏 (CS1708) ではなく、ロヌカルたたはフィヌルド経由でのみアクセスしたす。
  • fixed属性 (System.Runtime.CompilerServices.FixedBuffer) の代わりに、 フィヌルド修食子を䜿甚したす。 この属性はプロパティにも適甚しないでください (CS8372)。
  • 1 次元のみの固定バッファヌを宣蚀したす (CS7092)。 倚次元固定バッファヌはサポヌトされおいたせん。
  • 固定サむズのバッファヌを ref フィヌルドずしお宣蚀しないでください (CS9049)。 固定サむズバッファヌは倀フィヌルドである必芁がありたす。

関数ポむンタヌ

  • CS8812: > メ゜ッド グルヌプ 'method' を非関数ポむンタヌ型 'type' に倉換できたせん。

関数ポむンタヌを取埗するには、明瀺的な関数ポむンタヌ型キャストで address-of 挔算子を䜿甚したす。 address-of 挔算子&を䜿甚しお、メ゜ッド グルヌプをvoid*たたはその他の非関数ポむンタヌ型に割り圓おないでください。 詳现に぀いおは、「 関数ポむンタヌ」を参照しおください。