rksoftware

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

C# 13 の新機能「OverloadResolutionPriority 属性」その 3

.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

■ 下位互換で活躍

ライブラリなどをアップデートするときに下位互換を維持しながら新機能 (新メソッド) を追加するときなどに活躍すると思います。
しっかり使いこなして行きましょう。