rksoftware

Visual Studio とか C# とかが好きです

C# 11 の新機能を確認「 汎用属性 」

C# 11 の新機能を確認しています。目次は次の記事です。
rksoftware.hatenablog.com

今回は 「 汎用属性 」。公式 Learn の記事は C# 11 の新機能のページにしか見つけられませんでした。

この新機能日本語よりも英語の名前の方が分かりやすいと思います。「 Generic attributes 」です。名前のまま。属性のクラスを Generic にできます。

■ 確認

次のようなコードが書けます。

class SampleAttribute<T> : Attribute { }

実際に書いて確認すると次のような感じです。

var typeString = typeof(SampleStringClass).GetCustomAttributes(false)[0].GetType();
var typeInt = typeof(SampleIntClass).GetCustomAttributes(false)[0].GetType();
Console.WriteLine(typeString);  // SampleAttribute`1[System.String]
Console.WriteLine(typeInt);     // SampleAttribute`1[System.Int32]

class SampleAttribute<T> : Attribute { }

[Sample<string>] class SampleStringClass { }
[Sample<int>] class SampleIntClass { }

ちなみに前者のコードは .NET 6 を指定した場合は次のエラーになります。

エラー CS8936 機能 '汎用属性' は C# 10.0 では使用できません。言語バージョン 11.0 以上を使用してください。

■ 必要な時、自然に書くと思います

この新機能は使う機会のない人はあまり使わないと思います。ただし、必要な時、特に意識せずに書いていると思います。というか、私自身過去に何度かこう書こうとして残念な思いをしたことがあります。この機能は備えておかなくても、安心安全ですね。