.NET 9 Preview 7 で C# 13 の新機能「OverloadResolutionPriority」属性が追加されました。
オーバーロードの解決の優先順位を操作できる属性のようです。
今回はそのお試しその 3 です。
今回も前回同様素直な思った通りの動作ですね。いいですね。
その 1、その 2 はこちら
rksoftware.hatenablog.com rksoftware.hatenablog.com
■ 実例その 3
前回はライブラリで OverloadResolutionPriority 属性を使った時のアプリの挙動を見てみます。
何も指定していない場合
引数が short のメソッドが選択されています。
アプリのコード
Console.WriteLine("ConsoleApp v1"); ClassLibrary1.Class1.Test((int)1);
ライブラリのコード
namespace ClassLibrary1; public static class Class1 { public static void Test(short a) => Console.WriteLine("ClassLibrary v1: short"); public static void Test(long a) => Console.WriteLine("ClassLibrary v1: long"); }
実行結果
ConsoleApp v1 ClassLibrary v1: short
アプリをビルドしなおさずライブラリだけ変更してビルドした場合
実行結果で ClassLibrary v2
と表示されているのでライブラリは変更されていますが、変わらずに引数が short のメソッドが選択されています。
これは、アプリの側のビルド時にどのメソッドを使うかが決まるからでしょう。
アプリのコード
Console.WriteLine("ConsoleApp v1"); ClassLibrary1.Class1.Test((int)1);
ライブラリのコード
namespace ClassLibrary1; public static class Class1 { [System.Runtime.CompilerServices.OverloadResolutionPriority(-1)] public static void Test(short a) => Console.WriteLine("ClassLibrary v2: short"); public static void Test(long a) => Console.WriteLine("ClassLibrary v2: long"); }
実行結果
ConsoleApp v1 ClassLibrary v2: short
アプリもビルドした場合
優先と設定した引数が long のメソッドが選択されています。
アプリのコード
Console.WriteLine("ConsoleApp v2"); ClassLibrary1.Class1.Test((int)1);
ライブラリのコード
namespace ClassLibrary1; public static class Class1 { [System.Runtime.CompilerServices.OverloadResolutionPriority(-1)] public static void Test(short a) => Console.WriteLine("ClassLibrary v2: short"); public static void Test(long a) => Console.WriteLine("ClassLibrary v2: long"); }
実行結果
ConsoleApp v2 ClassLibrary v2: long
■ 下位互換で活躍
ライブラリなどをアップデートするときに下位互換を維持しながら新機能 (新メソッド) を追加するときなどに活躍すると思います。
しっかり使いこなして行きましょう。