C# は広範なカスタマイズを提供しますが、特に汎用の属性タイプが除外されています。 この制限により、「なぜ?
」という疑問が生じます。ジェネリック型パラメーターを使用してカスタム属性を定義しようとすると、次のようなコンパイル時エラーが発生します。
<code class="language-csharp">public sealed class ValidatesAttribute<T> : Attribute { } [Validates<string>] public static class StringValidation { }</code>
共通言語インフラストラクチャ (CLI) は汎用属性をサポートしていますが、C# では特にそれを禁止しています。これは CLI の制限ではなく、内部 C# 設計の選択です。
この禁止の正確な理由を特定することは困難であることが判明しています。 C# 言語仕様には明確な説明がありません。 ただし、コミュニティの議論や専門家の意見は、いくつかの可能性を示唆しています。
ある理論では、汎用属性型は言語とコンパイラに不必要な複雑さをもたらす可能性があると仮定しています。 この機能をサポートするには、安定性とパフォーマンスを維持するために追加の言語メカニズムとコンパイラの最適化が必要になります。
もう 1 つの観点は、汎用属性の実際の応用は限られており、開発コストが潜在的な利益を上回っているということです。 C# 設計者は他の機能を優先した可能性があります。
元 C# チーム メンバーの Eric Lippert 氏が簡潔に説明しました。この制限は、実用的価値が限られた機能について、言語とコンパイラの両方で不必要な複雑さを回避するために存在します。完全に満足のいくものではありませんが、この洞察は C# の設計選択の背後にある意思決定プロセスに光を当てます。
以上がC# でジェネリック属性型が許可されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。