C# ではなぜジェネリック属性型が禁止されているのでしょうか? 質問する

C# ではなぜジェネリック属性型が禁止されているのでしょうか? 質問する

これにより、コンパイル時の例外が発生します。

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

C# はジェネリック属性をサポートしていないことはわかっています。しかし、グーグルでいろいろ検索しても、その理由がわかりません。

ジェネリック型が から派生できない理由を知っている人はいますかAttribute? 何か理論はありますか?

ベストアンサー1

まあ、なぜ利用できないのかは答えられませんが、 CLI の問題ではないことは確認できます。CLI 仕様ではこれについて言及されていません (私が見る限り)。IL を直接使用する場合は、汎用属性を作成できます。これを禁止している C# 3 仕様の部分 (セクション 10.1.4「クラス ベース仕様」) には、正当性が示されていません。

注釈付きの ECMA C# 2 仕様でも、許可されていない例が示されていますが、役立つ情報は提供されていません。

注釈付きの C# 3 仕様のコピーが明日届く予定です... そこにさらに情報があるかどうか確認してみます。いずれにせよ、これはランタイムの決定ではなく、言語の決定であることは間違いありません。

編集: Eric Lippert からの回答 (要約): 特に理由はありませんが、あまり価値を追加しないユースケースで言語とコンパイラーの両方の複雑さを回避するためです。

おすすめ記事