TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2531 2.49K
День 2092. #ЧтоНовенького
Разбираем Атрибут OverloadResolutionPriority в C# 13

C# 13 добавляет поддержку нового атрибута OverloadResolutionPriority. Этот атрибут является узкоспециализированным, поэтому большинство из вас не будет его использовать. Тем не менее, это приятное дополнение к языку, и о нём стоит знать, если вы пишете библиотеки.

Рассмотрим простой пример:
Sample.Test(); // Вывод: Test 1

static class Sample
{
public static void Test()
=> Console.WriteLine("Test 1");
}

Если вы захотите обновить сигнатуру и добавить новый необязательный параметр:
Sample.Test(); // Вывод: Test 1

static class Sample
{
public static void Test(
[CallerMemberName]string name = "")
=> Console.WriteLine("Test 1");
}

Но это ломает бинарный код, поскольку метода без параметров больше не существует. Лучшим решением было бы добавление перегрузки, но это не сработает:
Sample.Test(); // Вывод: Test 1

static class Sample
{
public static void Test()
=> Console.WriteLine("Test 1");

public static void Test(
[CallerMemberName]string name = "")
=> Console.WriteLine("Test 2");
}

Больше нет ломающего изменения. Но приложение выведет на консоль «Test 1». Причина в том, что компилятор предпочитает перегрузку без параметров, а не перегрузку с параметром по умолчанию, поскольку она лучше соответствует вызову.

Обратите внимание, что удаление первой перегрузки сломает бинарный код. Вы не можете это делать в библиотеке. Новый атрибут OverloadResolutionPriority позволяет указать приоритет разрешения перегрузки для компилятора. Компилятор выберет совместимую перегрузку с наивысшим приоритетом.
Sample.Test(); // Вывод: Test 2

static class Sample
{
[OverloadResolutionPriority(-1)]
public static void Test()
=> Console.WriteLine("Test 1");

public static void Test(
[CallerMemberName]string name = "")
=> Console.WriteLine("Test 2");
}

Используя этот атрибут, вы теперь можете добавить новую перегрузку, не нарушая существующий код. Компилятор выберет перегрузку с наивысшим приоритетом.

Вы также можете использовать этот атрибут для приоритизации некоторых перегрузок, которые требуют неявных преобразований:
Sample.Test(100);  // Вывод: byte
Sample.Test(1000); // Вывод: int

static class Sample
{
public static void Test(int a)
=> Console.WriteLine("int");

[OverloadResolutionPriority(1)]
public static void Test(byte a)
=> Console.WriteLine("byte");
}


Источник: https://www.meziantou.net/understanding-overloadresolutionpriority-attribute-in-csharp-13.htm
  • 👍 29
More from @netdeveloperdiary
  1. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  2. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  3. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  4. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 3, 2026Post #3360
  6. Oct 3, 2026День 2803. #Оффтоп Чем Заняться, Пока Работают Агенты? У VS Code Есть Ответ Сейчас большую…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →