この記事では、次のコンパイラ エラーについて説明します。
- CS0181: 属性コンストラクター パラメーターに型があり、有効な属性パラメーター型ではありません
- CS0243: 条件付き属性はオーバーライド メソッドであるため、'method' では無効です。
- CS0404: 属性はこの宣言型では無効です。
- CS0415: この属性は、明示的なインターフェイス メンバー宣言ではないインデクサーでのみ有効です。
- CS0416: 'type parameter': 属性引数は型パラメーターを使用できません。
- CS0447: 属性を型引数と共に使用することはできません。
- CS0577: 条件付き属性は、コンストラクター、デストラクター、演算子、ラムダ式、または明示的なインターフェイス実装であるため、無効です。
- CS0578: 戻 り値の型が void ではないため、条件属性は 'function' では無効です。
- CS0579: 重複する属性
- CS0582: 条件付き属性は、インターフェイス メンバーでは無効です。
- CS0592: この宣言型では属性が無効です。特定の宣言でのみ有効です。
- CS0609: オーバーライドとしてマークされたインデクサーに属性を設定できません。
- CS0616: 型が属性クラスではありません
- CS0625: StructLayout(LayoutKind.Explicit) でマークされた型のインスタンス フィールドには、FieldOffset 属性が必要です。
- CS0629: 条件付きメンバー 'member' は、型 'Type Name' のインターフェイス メンバー '基底クラス メンバー' を実装できません。
- CS0636: FieldOffset 属性は、StructLayout(LayoutKind.Explicit) でマークされた型のメンバーにのみ配置できます。
- CS0637: FieldOffset 属性は、静的フィールドまたは const フィールドでは使用できません。
- CS0641: この属性は、System.Attribute から派生したクラスでのみ有効です。
- CS0646: インデクサーを含む型に DefaultMember 属性を指定できません。
- CS0647: 属性の出力中にエラーが発生しました
- CS0653: 属性クラス 'class' は抽象であるため、適用できません。
- CS0657: Location はこの宣言の有効な属性の場所ではありません。この宣言の有効な属性の場所が一覧表示されます。このブロック内のすべての属性は無視されます。
- CS0658: Location は認識された属性の場所ではありません。この宣言の有効な属性の場所が一覧表示されます。このブロック内のすべての属性は無視されます。
- CS0668: 2 つのインデクサーの名前が異なります。IndexerName 属性は、型内のすべてのインデクサーで同じ名前で使用する必要があります
- CS0685: 条件付きメンバー 'member' に out パラメーターを指定することはできません。
- CS0735: TypeForwardedTo 属性の引数として指定された型が無効です
- CS0739: 重複した TypeForwardedToAttribute
- CS1608: RequiredAttribute 属性は C# 型では許可されていません
- CS1614: 属性名があいまいです。'@name' を使用するか、明示的に 'Attribute' サフィックスを含めます。
- CS1618: メソッドまたはそれがオーバーライドするメソッドに条件付き属性があるため、デリゲートを作成することができません。
- CS1667: 属性は、プロパティまたはイベント アクセサーでは無効です。特定の宣言でのみ有効です。
- CS1689: 属性はメソッドまたは属性クラスでのみ有効です
- CS7014: 属性はこのコンテキストでは無効です。
- CS7046: 属性パラメーターを指定する必要があります。
- CS7047: 属性パラメーター 'parameter1' または 'parameter2' を指定する必要があります。
- CS7067: 属性コンストラクター パラメーターは省略可能ですが、既定のパラメーター値は指定されませんでした。
- CS8959: Type1 から type2 への標準変換がないため、CallerArgumentExpressionAttribute を適用できません
- CS8960: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerLineNumberAttribute によってオーバーライドされます。
- CS8961: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerFilePathAttribute によってオーバーライドされます。
- CS8962: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerMemberNameAttribute によってオーバーライドされます。
- CS8963: パラメーターに適用された CallerArgumentExpressionAttribute は効果がありません。無効なパラメーター名で適用されます。
- CS8968: 属性型引数で型パラメーターを使用できない
- CS8970: 型はメタデータで表すことができないため、このコンテキストでは使用できません。
- CS9331: 属性を手動で適用することはできません。
属性の引数とパラメーター
属性引数またはパラメーターを誤って使用すると、次のエラーが表示されます。
- CS0181: 属性コンストラクター パラメーターに型があり、有効な属性パラメーター型ではありません
- CS0416: 'type parameter': 属性引数は型パラメーターを使用できません。
- CS0447: 属性を型引数と共に使用することはできません。
- CS0647: 属性の出力中にエラーが発生しました
- CS7046: 属性パラメーターを指定する必要があります。
- CS7047: 属性パラメーター 'parameter1' または 'parameter2' を指定する必要があります。
- CS7067: 属性コンストラクター パラメーターは省略可能ですが、既定のパラメーター値は指定されませんでした。
- CS8968: 属性型引数で型パラメーターを使用できない
- CS8970: 型はメタデータで表すことができないため、このコンテキストでは使用できません。
これらのエラーを修正するには、次の規則に従います。
- 属性コンストラクター パラメーターでは、有効な属性パラメーター型 (CS0181) を使用する必要があります。 C# 言語仕様では、属性パラメーターの型をプリミティブ型 (
bool、byte、char、double、float、int、long、short、およびstring)、object、System.Type、列挙型、および 1 次元配列に制限します。 メタデータで表すことができない関数ポインターやその他の型は、有効な属性パラメーター型ではありません。 - 属性引数はコンパイル時定数値である必要があるため、型パラメーターを属性引数として使用することはできません (CS0416)。 コンパイラはコンパイル時に属性引数を解決する必要があり、ジェネリック型が構築されるまで型パラメーターは認識されません。
- 非ジェネリック属性 (CS0447) に型引数を適用することはできません。 属性クラスがジェネリックでない場合、その使用法で山かっこに型引数を含めることはできません。
- 属性コンストラクターに渡されるすべての値は、各パラメーター (CS0647) の有効な範囲内で正しく書式設定されている必要があります。 たとえば、 GuidAttribute には有効な GUID 書式指定文字列が必要です。
- 属性 (CS7046、CS7047) を適用するときは、必要なすべての属性パラメーターを指定する必要があります。 属性のコンストラクターシグネチャを調べて、必須のパラメーターを決定し、各パラメーターに有効な引数を指定します。
- オプションのコンストラクター パラメーターを使用してカスタム属性を定義する場合は、それらのパラメーターの既定値を指定します (CS7067)。 呼び出し元がこれらの引数を省略できるように、属性コンストラクターで構文
parameterType parameterName = defaultValueを使用します。 - ジェネリック属性の型引数は、型パラメーターではなく具象型である必要があります (CS8968)。 コンパイラはコンパイル時にジェネリック属性の型引数を完全に決定する必要があるため、開いている型パラメーターは許可されません。
- 属性引数として使用される型は、メタデータ (CS8970) で表現できる必要があります。
dynamicまたは特定のタプル要素名を含む型など、一部の構築された型はメタデータでエンコードできないため、属性の型引数として許可されません。
詳細については、 属性、 ジェネリック、および 属性の C# 言語仕様に関するセクションを参照してください。
注
CS0447 と CS0647 は非推奨です。 現在のコンパイラでは、これらのエラーは出力されません。
属性クラスの要件
必要な制約を満たしていない属性クラスを定義すると、次のエラーが表示されます。
- CS0404: 属性はこの宣言型では無効です。
- CS0579: 重複する属性
- CS0616: 型が属性クラスではありません
- CS0641: この属性は、System.Attribute から派生したクラスでのみ有効です。
- CS0653: 属性クラス 'class' は抽象であるため、適用できません。
- CS1614: 属性名があいまいです。'@name' を使用するか、'Attribute' サフィックスを明示的に含めます。
これらのエラーを修正するには、次の規則に従います。
- 属性の AttributeUsageAttribute で許可される宣言型にのみ属性を適用します (CS0404)。 属性の
AttributeTargetsで指定されたAttributeUsage値を調べて、有効なターゲットを確認します。 - 同じ属性を 1 つのターゲットに複数回適用する場合は、重複を削除するか、属性の
AllowMultiple = true(AttributeUsageAttribute) でを設定します。 既定では、属性は各ターゲットに 1 回だけ表示できます。 - 属性構文で使用される型は、 System.Attribute (CS0616) から継承する必要があります。 属性として使用できるのは、
System.Attributeから派生したクラスだけです。 他の型では、名前が似ている場合でも、このエラーが発生します。 -
AttributeUsageAttributeは、
Attribute(CS0641) から派生したクラスにのみ適用できます。AttributeUsage属性は、他の属性の使用方法を制御し、それ自体が属性クラスに制限されます。 - 属性クラスは、コンパイラでインスタンス化する必要があるため、
abstractできません (CS0653)。 属性クラスからabstract修飾子を削除するか、抽象基本から具象クラスを派生させます。 -
Example属性クラスとExampleAttribute属性クラスの両方が存在する場合、コンパイラは、どの[Example]が参照するかを判断できません (CS1614)。 短い名前に[@Example]を使用して曖昧さを解消するか、長い名前に[ExampleAttribute]を使用してください。
詳細については、 カスタム属性の作成と属性のC# 言語仕様に関するセクションを参照してください。
属性の場所のコンテキスト
無効な場所に属性を適用するか、正しくないターゲット指定子を使用すると、次のエラーが発生します。
- CS0592: この宣言型では属性が無効です。特定の宣言でのみ有効です。
- CS0657: Location はこの宣言の有効な属性の場所ではありません。この宣言の有効な属性の場所が一覧表示されます。このブロック内のすべての属性は無視されます。
- CS0658: Location は認識された属性の場所ではありません。この宣言の有効な属性の場所が一覧表示されます。このブロック内のすべての属性は無視されます。
- CS1667: 属性は、プロパティまたはイベント アクセサーでは無効です。特定の宣言でのみ有効です。
- CS7014: 属性はこのコンテキストでは無効です。
これらのエラーを修正するには、次の規則に従います。 詳細については、 属性の指定に関する「属性ターゲット と C# 言語仕様」セクションを参照してください。
- 各属性の AttributeUsageAttribute は、ターゲットとする宣言の型を指定します。 属性は、これらの型 (CS0592) にのみ適用する必要があります。 たとえば、
AttributeTargets.Interfaceで定義された属性をクラスに適用することはできません。 -
method:やproperty:などの属性ターゲット指定子を使用する場合は、指定子が表示される宣言に対して有効である必要があります (CS0657)。 エラー メッセージを調べて、特定の宣言で許可されているターゲット指定子を確認します。 - 使用した属性ターゲット指定子が認識された指定子 (CS0658) ではありません。 有効な指定子には、
assembly:、module:、type:、method:、property:、field:、event:、param:、およびreturn:が含まれます。 - ObsoleteAttributeやCLSCompliantAttributeなどの一部の属性は、プロパティまたはイベント アクセサー (CS1667) では無効です。 アクセサーからプロパティまたはイベント宣言自体に属性を移動します。
- 属性は、それらをサポートするプログラム要素 (CS7014) にのみ表示できます。 アセンブリ レベルまたはモジュール レベルの属性を適用する場合は、
assembly:またはターゲット指定子module:使用し、ファイルの先頭に配置します。
定義済みの属性
特定の定義済みの .NET 属性を誤って使用すると、次のエラーが発生します。
- CS0415: この属性は、明示的なインターフェイス メンバー宣言ではないインデクサーでのみ有効です。
- CS0609: オーバーライドとしてマークされたインデクサーに属性を設定できません。
- CS0625: StructLayout(LayoutKind.Explicit) でマークされた型のインスタンス フィールドには、FieldOffset 属性が必要です。
- CS0636: FieldOffset 属性は、StructLayout(LayoutKind.Explicit) でマークされた型のメンバーにのみ配置できます。
- CS0637: FieldOffset 属性は、静的フィールドまたは const フィールドでは使用できません。
- CS0646: インデクサーを含む型に DefaultMember 属性を指定できません。
- CS0668: 2 つのインデクサーの名前が異なります。IndexerName 属性は、型内のすべてのインデクサーで同じ名前で使用する必要があります
- CS0735: TypeForwardedTo 属性の引数として指定された型が無効です
- CS0739: 重複する TypeForwardedToAttribute
- CS1608: RequiredAttribute 属性は C# 型では許可されていません
- CS9331: 属性を手動で適用することはできません。
これらのエラーを修正するには、次の規則に従います。 詳細については、「 インデクサー、 構造体の型、 TypeForwardedToAttribute、 プラットフォーム呼び出し (P/Invoke)」を参照してください。
- IndexerNameAttributeは、明示的なインターフェイス メンバー宣言 (CS0415) ではないインデクサーにのみ適用できます。 インターフェイスでインデクサー名が既に定義されているため、明示的なインターフェイス インデクサーから属性を削除します。
- オーバーライド インデクサーは基底クラス (
IndexerName) から名前を継承するため、overrideでマークされたインデクサーにを適用することはできません。 オーバーライド インデクサーからIndexerName属性を削除します。 -
StructLayout(LayoutKind.Explicit)でマークされた型のすべてのインスタンス フィールドには、FieldOffsetAttribute (CS0625) が必要です。 明示的なレイアウトでは、各インスタンス フィールドのバイト オフセットを指定する必要があります。 -
FieldOffsetAttributeは、StructLayoutAttributeが
LayoutKind.Explicitに設定されている型のメンバーにのみ配置できます (CS0636)。StructLayout属性を含む型宣言に追加します。 - 明示的なレイアウトはインスタンス フィールドにのみ適用されるため、
FieldOffset属性はstaticフィールドまたはconstフィールドでは使用できません (CS0637)。 静的フィールドまたは const フィールドからFieldOffset属性を削除します。 - インデクサーが既に含まれている型に DefaultMemberAttribute を適用することはできません。これは、コンパイラがインデクサー (CS0646) を持つ型の既定のメンバーを自動的に定義するためです。
DefaultMember属性を削除します。 - 型内のすべての IndexerNameAttribute 属性は、同じ名前 (CS0668) を指定する必要があります。 ランタイムは型のすべてのインデクサーに 1 つの名前を使用するため、一致するように名前を変更します。
- TypeForwardedToAttributeの引数として指定する型は、非ジェネリック、非入れ子、非ポインター、非配列型 (CS0735) である必要があります。 最上位レベルの名前付き型のみが有効な転送ターゲットです。
- アセンブリは、外部型 (TypeForwardedToAttribute) ごとに 1 つののみを持つことができます。 重複する
TypeForwardedTo宣言を見つけて削除します。 - C# (RequiredAttributeAttribute) で定義された型では、は許可されません。 この属性は、コンパイラに特定の機能を強制的に要求する必要がある他の言語用に予約されています。
- 一部の属性はコンパイラ用に予約されており、ソース コード (CS9331) では手動で適用できません。 属性を、コンパイラによって生成される同等の C# 言語構文に置き換えます。
条件付き属性の使用
使用制限に違反する方法で ConditionalAttribute を適用すると、次のエラーが表示されます。
- CS0243: 条件付き属性はオーバーライド メソッドであるため、'method' では無効です。
- CS0577: 条件付き属性は、コンストラクター、デストラクター、演算子、ラムダ式、または明示的なインターフェイス実装であるため、無効です。
- CS0578: 戻 り値の型が void ではないため、条件属性は 'function' では無効です。
- CS0582: 条件付き属性は、インターフェイス メンバーでは無効です。
- CS0629: 条件付きメンバー 'member' は、型 'Type Name' のインターフェイス メンバー '基底クラス メンバー' を実装できません。
- CS0685: 条件付きメンバー 'member' に out パラメーターを指定することはできません。
- CS1618: メソッドまたはそれがオーバーライドするメソッドに条件付き属性があるため、メソッドでデリゲートを作成できません
- CS1689: 属性はメソッドまたは属性クラスでのみ有効です
これらのエラーを修正するには、次の規則に従います。 詳細については、「 ConditionalAttribute、 条件付きメソッド、および 属性」を参照してください。
- コンパイラはオーバーライドではなく基本メソッド宣言に呼び出しをバインドするため、
Conditional属性を オーバーライド メソッドに適用することはできません (CS0243)。 オーバーライド メソッドからConditional属性を削除するか、overrideキーワードを削除します。 -
Conditional属性は、コンストラクター、ファイナライザー、演算子、ラムダ式、または明示的なインターフェイス実装 (CS0577) では有効ではありません。 これらのメンバー型は、型のライフサイクルまたはコントラクトで必要なロールを持っているため、条件付きで省略できません。 - コンパイラが呼び出しを完全に省略する可能性があり、呼び出し元が戻り値を使用できないため、条件付きメソッドは
voidを返す必要があります (CS0578)。 メソッドの戻り値の型をvoidに変更するか、Conditional属性を削除します。 - すべてのインターフェイス メンバーを実装する必要があるため、インターフェイス メンバーを条件付きにすることはできません (CS0582)。 インターフェイス メンバー宣言から
Conditional属性を削除します。 - インターフェイス コントラクトではすべてのビルドに存在する必要があるため、インターフェイス メンバーを実装するメソッドを条件付きにすることはできません (CS0629)。 実装メソッドから
Conditional属性を削除します。 - コンパイラがメソッド呼び出しを省略すると、
out変数の値が未定義になるため、条件付きメソッドはoutパラメーターを持つことができません (CS0685)。 メソッドからoutパラメーターを削除するか、Conditional属性を削除します。 - 条件シンボルが定義されていないビルドにメソッドが存在しない可能性があるため、条件付きメソッドを参照するデリゲートを作成できません (CS1618)。 メソッドから
Conditional属性を削除するか、デリゲート ターゲットとして使用しないでください。 -
Conditional属性は、メソッドおよび属性クラス (CS1689) でのみ有効です。 属性以外のクラス、構造体、インターフェイスなど、他の宣言型では無効です。
CallerArgumentExpression 属性の使用法
次のエラーは、 CallerArgumentExpressionAttribute 正しく適用しない場合、または他の呼び出し元情報属性と競合している場合に発生します。
- CS8959: Type1 から type2 への標準変換がないため、CallerArgumentExpressionAttribute を適用できません
- CS8960: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerLineNumberAttribute によってオーバーライドされます。
- CS8961: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerFilePathAttribute によってオーバーライドされます。
- CS8962: パラメーターに適用された CallerArgumentExpressionAttribute は無効です。CallerMemberNameAttribute によってオーバーライドされます。
- CS8963: パラメーターに適用された CallerArgumentExpressionAttribute は効果がありません。無効なパラメーター名で適用されます。
これらのエラーを修正するには、次の規則に従います。 詳細については、「 呼び出し元情報の属性 と CallerArgumentExpressionAttribute」を参照してください。
-
CallerArgumentExpressionで修飾されるパラメーターには、型stringまたはstringからの標準変換を含む型が必要です。これは、この属性によって呼び出し元の引数式のstring表現が挿入されるためです (CS8959)。 パラメーターの型をstringまたは互換性のある型に変更します。 -
CallerArgumentExpression属性は、CallerLineNumberAttribute、CallerFilePathAttribute、またはCallerMemberNameAttribute (CS8960、CS8961、CS8962) も持つパラメーターには影響しません。 これらの呼び出し元情報属性が優先されるため、パラメーターからCallerArgumentExpression属性を削除します。 -
CallerArgumentExpressionコンストラクターに渡される文字列引数は、同じメソッド シグネチャ (CS8963) 内の別のパラメーターの名前と一致する必要があります。 パラメーター名のスペルが間違っているか、存在しないパラメーターを参照している場合、属性は無効になります。
.NET