rksoftware

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

C# 9.0 の確認「ローカル関数の属性」

C# 9.0 の確認の目次はこちら

■ ローカル関数の属性

ドキュメントはこちら

適合性と完成度の機能 という項目の割と読み進めた所の 「ようやく、ローカル関数に属性を適用できるようになりました」 から始まるブロックです。
言葉の通り、ローカル関数で属性をつけられます。ローカル変数という狭い世界に閉じたものに属性をつけてどうこうする機会は少ない気もしますが、制約が少ないのはうれしいことですし、実際には技術的な負債を返済している途中のも多くのコードで大いに役に立つでしょう。

■ 検証コードと結果

■ 以前のバージョン

例えば次のようなコードはエラーになりました。

#nullable enable
static void Main(string[] args)
{
    var list = List(null);

    [System.Obsolete]
    static IEnumerable<int> List([System.Diagnostics.CodeAnalysis.NotNull] string text) => new int[0];
}

エラー箇所は 2 つの属性、System.ObsoleteSystem.Diagnostics.CodeAnalysis.NotNull です。どちらも次のエラーです。

'ローカル関数の属性' は C# 8.0 では使用できません。言語バージョン 9.0 以上を使用してください。

そのままのメッセージですね。わかりやすい

■ C# 9 では

C# 9 ではエラーとなりません。

#nullable enable
static void Main(string[] args)
{
    var list = List(null);

    [System.Obsolete]
    static IEnumerable<int> List([System.Diagnostics.CodeAnalysis.NotNull] string text) => new int[0];
}

実際にこのコードを書いてみると警告が出ますが、それは大丈夫です。今回例としてつけた属性が警告を表示する属性なので。
警告が出るのは

var list = List(null);

の部分で

'List(string)' は古い形式です
null リテラルを null 非許容参照型に変換できません。

の 2 つの警告です。どちらもソースコードをアップデートしている最中に有益な属性です。

■ まとめ

今回は細かいところまで強く記憶に残しておかなくても大丈夫でしょう。書きたくなった時に書いてみたらうまくいった、そういうやつです。ただ、他人が「書ける」といったときに古い知識で「書けない」と全力否定してしまうのは格好が悪いので、軽くで良いので覚えておきましょう。