1. ホーム
  2. c#

[解決済み] なぜC#は汎用属性型を禁止しているのですか?

2022-03-18 15:56:20

質問

この場合、コンパイル時例外が発生します。

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

C#がgeneric属性をサポートしていないことは承知しています。しかし、いろいろとググってみても、その理由が見つからないようです。

なぜジェネリック型は Attribute ? 何か説はありますか?

解決方法は?

まあ、使えない理由は答えられませんが、私は できる CLIの問題ではないことを確認しています。CLIの仕様には(私が見る限り)記載がありませんし、ILを直接使えば汎用的な属性を作ることができます。C# 3 の仕様で禁止されている部分(セクション 10.1.4 "クラスベースの仕様")には、正当な理由が書かれていないのです。

ECMA C# 2の注釈付き仕様書は、何が許されないかの例を示していますが、役に立つ情報は何もありません。

明日には注釈付きC# 3仕様が届くはずなんだけど...。それで何か情報が得られるかどうか見てみるよ。とにかく、これはランタイムの問題ではなく、言語の問題であることは間違いありません。

EDIT: Eric Lippertからの回答(言い換え): 特別な理由はありません。