次の方法で共有


ref struct 型に関連するエラーと警告

  • CS8343: ref structs ではインターフェイスを実装できません
  • CS8344: foreach ステートメントは、非同期または反復子メソッドの列挙子に対して機能できません。型が ref struct であるか、ref struct を許可する型パラメーターであるためです。
  • CS8345: フィールドまたは自動実装プロパティは、それが ref struct のインスタンス メンバーである場合を除いて、型にすることができません。
  • CS9048: scoped 修飾子は、参照および ref struct の値に対してのみ使用できます。
  • CS9050: ref フィールドは ref struct を参照できません。
  • CS9059: ref フィールドは ref struct でのみ宣言できます。
  • CS9241: "ref struct" は既に指定されています。
  • CS9242: "allows" 制約句は最後に指定する制約でなければなりません。
  • CS9243: 他の制約から認識されている型パラメーターの ref struct をクラスにすることはできません。
  • CS9244: この型は、ref struct でも、ジェネリック型またはメソッドでパラメーターとして使用するために ref struct を許可する型パラメーターでもない可能性があります。
  • CS9245: 型では、ref struct 型に対してインターフェイス メンバーを実装できません。
  • CS9246: ref struct を許可する型パラメーターでは、非仮想インスタンス インターフェイス メンバーにアクセスできません。
  • CS9247: foreach ステートメントは型の列挙子に対して機能できません。それが ref struct を許可する型パラメーターであり、コンパイル時に IDisposable を実装することがわかっていないためです。
  • CS9267: 反復子の Element 型は、ref 構造体または ref 構造体を許可する型パラメーターにすることはできません

参照の安全性の違反

  • CS8345: フィールドまたは自動実装プロパティは、それが ref struct のインスタンス メンバーである場合を除いて、型にすることができません。
  • CS9048: scoped 修飾子は、参照および ref struct の値に対してのみ使用できます。
  • CS9050: ref フィールドは ref struct を参照できません。
  • CS9059: ref フィールドは ref struct でのみ宣言できます。

ref struct 型には ref フィールドを含めることができます。 他の型では ref フィールドは許可されません。 コンパイラでは、ref struct 型のインスタンスに関する参照の安全性ルールを適用するために、ref struct 型の宣言と使用に関して制限を実施しています。

  • 自動的に実装されるrefプロパティを含めることができるのは、ref struct型のみです。
  • ref struct 型または ref 変数のみに scoped 修飾子を含めることができます。
  • ref フィールドは ref struct 型内でのみ宣言できます。
  • ref フィールドは ref struct 型を参照できません。

これらのルールのいずれかに違反すると、一覧に示されているいずれかのエラーが発生します。 その言語機能を使用する場合は、型を ref struct に変換します。 そうでない場合は、許可されていないコンストラクトを削除します。

ref struct インターフェイスの実装

  • CS8343: ref structs ではインターフェイスを実装できません
  • CS8344: foreach ステートメントは、非同期または反復子メソッド内の列挙子に対して機能できません。型が ref struct であるか、ref struct を許可する型パラメーターであるためです。
  • CS9241: "ref struct" は既に指定されています。
  • CS9242: "allows" 制約句は最後に指定する制約でなければなりません。
  • CS9243: 他の制約から認識されている型パラメーターの ref struct をクラスにすることはできません。
  • CS9244: この型は、ref struct でも、ジェネリック型またはメソッドでパラメーターとして使用するために ref struct を許可する型パラメーターでもない可能性があります。
  • CS9245: 型では、ref struct 型に対してインターフェイス メンバーを実装できません。
  • CS9246: ref struct を許可する型パラメーターでは、非仮想インスタンス インターフェイス メンバーにアクセスできません。
  • CS9247: foreach ステートメントは型の列挙子に対して機能できません。それが ref struct を許可する型パラメーターであり、コンパイル時に IDisposable を実装することがわかっていないためです。
  • CS9267: 反復子の Element 型は、ref 構造体または ref 構造体を許可する型パラメーターにすることはできません

C# 13 より前には、ref struct 型ではインターフェイスを実装できませんでした。コンパイラで CS8343 が生成されます。 C# 13 以降、ref struct 型では、次のルールに従ってインターフェイスを実装できます。

  • ref struct は、それが実装するインターフェイスのインスタンスに変換できません。 この制限事項には、パラメーターがインターフェイス型の場合に ref struct 型を引数として使用する場合の暗黙的な変換が含まれます。 変換によってボックス化変換が行われるので、参照の安全性に違反します。
  • インターフェイスを実装する ref struct は、すべてのインターフェイス メンバーを実装する "必要があります"。 ref struct は、インターフェイスに既定の実装が含まれるメンバーを実装する必要があります。

C# 13 以降では、ジェネリック型パラメーターに allows ref struct 反制約がある場合に限り、ref struct をジェネリック型パラメーターの型引数として使用できます。 allows ref struct 反制約を使用する場合は、次のルールに従う必要があります。

  • ref struct は型引数として使用します。型パラメーターには allows ref struct 反制約が "必要" です。allows ref struct 反制約は、そのパラメーターの where 句内で最後に指定する必要があります
  • 型パラメーターのインスタンスを使用する場合は、参照の安全性ルールに従う必要があります。
  • ref structまたはref struct型にできる型引数を、iterator メソッドの要素型として使用することはできません